/ Hex Artifact Content
Login

Artifact 0b8ed82a5d6cdd8c8f48520789b46a6fd3fcb3ba:


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 20   "mmap",        
3c70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3c80: 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20  l_ptr)mmap,     
3c90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3ca0: 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20  e.  { "mmap",   
3cb0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3cc0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ce0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3cf0: 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a  osMmap ((void*(*
3d00: 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69  )(void*,size_t,i
3d10: 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74  nt,int,int,off_t
3d20: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
3d30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
3d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
3d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
3d70: 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  0.  { "munmap", 
3d80: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3d90: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61  yscall_ptr)munma
3da0: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
3db0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75 6e 6d  .#else.  { "munm
3dc0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
3dd0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3df0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3e00: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
3e10: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3e20: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3e30: 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  23].pCurrent)..#
3e40: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 26  if HAVE_MREMAP &
3e50: 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49  & (!defined(SQLI
3e60: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
3e70: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
3e80: 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 6d 72 65  SIZE>0).  { "mre
3e90: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
3ea0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3eb0: 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20  )mremap,        
3ec0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3ed0: 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20   "mremap",      
3ee0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3ef0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3f00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3f10: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65  if.#define osMre
3f20: 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76  map ((void*(*)(v
3f30: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65  oid*,size_t,size
3f40: 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  _t,int,...))aSys
3f50: 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e  call[24].pCurren
3f60: 74 29 0a 0a 20 20 7b 20 22 67 65 74 70 61 67 65  t)..  { "getpage
3f70: 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33  size",  (sqlite3
3f80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 69  _syscall_ptr)uni
3f90: 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30 20  xGetpagesize, 0 
3fa0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
3fb0: 70 61 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a  pagesize ((int(*
3fc0: 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c  )(void))aSyscall
3fd0: 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [25].pCurrent)..
3fe0: 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20    { "readlink", 
3ff0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
4000: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69 6e  call_ptr)readlin
4010: 6b 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  k,        0 },.#
4020: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e  define osReadlin
4030: 6b 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63  k ((ssize_t(*)(c
4040: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a  onst char*,char*
4050: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
4060: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
4070: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
4080: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
4090: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
40a0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ../*.** On some 
40b0: 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74  systems, calls t
40c0: 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20  o fchown() will 
40d0: 74 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67  trigger a messag
40e0: 65 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a  e in a security.
40f0: 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63  ** log if they c
4100: 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f  ome from non-roo
4110: 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f  t processes.  So
4120: 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66   avoid calling f
4130: 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65  chown() if.** we
4140: 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67   are not running
4150: 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61   as root..*/.sta
4160: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63  tic int robustFc
4170: 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64  hown(int fd, uid
4180: 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69  _t uid, gid_t gi
4190: 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d){.#if OS_VXWOR
41a0: 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  KS.  return 0;.#
41b0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 6f 73  else.  return os
41c0: 47 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  Geteuid() ? 0 : 
41d0: 6f 73 46 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c  osFchown(fd,uid,
41e0: 67 69 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  gid);.#endif.}..
41f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
4200: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
4210: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
4220: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
4230: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78   of the.** "unix
4240: 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e  " VFSes.  Return
4250: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20   SQLITE_OK opon 
4260: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64  successfully upd
4270: 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73  ating the.** sys
4280: 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72  tem call pointer
4290: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
42a0: 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73  OUND if there is
42b0: 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65   no configurable
42c0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
42d0: 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a  named zName..*/.
42e0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
42f0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
4300: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
4310: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
4320: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
4330: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
4340: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4350: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
4360: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
4370: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
4380: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
4390: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
43a0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
43b0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
43c0: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
43d0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
43e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
43f0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
4400: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4410: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
4420: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
4430: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
4440: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
4450: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
4460: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
4470: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
4480: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
4490: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
44a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
44b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
44c0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
44d0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
44e0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
44f0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4500: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
4510: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
4520: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
4530: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
4540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
4560: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
4570: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
4580: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
4590: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
45a0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
45b0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
45c0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
45d0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
45e0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
45f0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
4600: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
4610: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
4620: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
4630: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
4640: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
4650: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4660: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
4670: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
4680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4690: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
46a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
46b0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
46c0: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
46d0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
46e0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
46f0: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
4700: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
4710: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4720: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4740: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
4750: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
4760: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
4770: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
4780: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
4790: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
47a0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
47b0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
47c0: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
47d0: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
47e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
47f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4800: 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c  unixGetSystemCal
4810: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4820: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
4830: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
4840: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
4850: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
4860: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4870: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
4880: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4890: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
48a0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
48b0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
48c0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
48d0: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
48e0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
48f0: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
4900: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4910: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
4920: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
4930: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
4940: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
4950: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
4960: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
4970: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
4980: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
4990: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
49a0: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
49b0: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
49c0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
49d0: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
49e0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
49f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4a00: 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53   char *unixNextS
4a10: 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65  ystemCall(sqlite
4a20: 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20  3_vfs *p, const 
4a30: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4a40: 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55  int i = -1;..  U
4a50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
4a60: 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  p);.  if( zName 
4a70: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4a80: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
4a90: 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  call)-1; i++){. 
4aa0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
4ab0: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
4ac0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
4ad0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4ae0: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72    for(i++; i<Arr
4af0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
4b00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4b10: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4b20: 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e  rent!=0 ) return
4b30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
4b40: 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  me;.  }.  return
4b50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20   0;.}../*.** Do 
4b60: 6e 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66  not accept any f
4b70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c  ile descriptor l
4b80: 65 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61  ess than this va
4b90: 6c 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  lue, in order to
4ba0: 20 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e   avoid.** openin
4bb0: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
4bc0: 75 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72  using file descr
4bd0: 69 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20  iptors that are 
4be0: 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f  commonly used fo
4bf0: 72 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  r .** standard i
4c00: 6e 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e  nput, output, an
4c10: 64 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  d error..*/.#ifn
4c20: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  def SQLITE_MINIM
4c30: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
4c40: 4f 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  OR.# define SQLI
4c50: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
4c60: 44 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e  DESCRIPTOR 3.#en
4c70: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  dif../*.** Invok
4c80: 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f  e open().  Do so
4c90: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c   multiple times,
4ca0: 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72   until it either
4cb0: 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20   succeeds or.** 
4cc0: 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72  fails for some r
4cd0: 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  eason other than
4ce0: 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66   EINTR..**.** If
4cf0: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
4d00: 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30  on mode "m" is 0
4d10: 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20   then set it to 
4d20: 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a  the default for.
4d30: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  ** SQLite.  The 
4d40: 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54  default is SQLIT
4d50: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
4d60: 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d  ERMISSIONS (norm
4d70: 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73  ally.** 0644) as
4d80: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
4d90: 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20   system umask.  
4da0: 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74  If m is not 0, t
4db0: 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20  hen.** make the 
4dc0: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4dd0: 64 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20  de be exactly m 
4de0: 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61  ignoring the uma
4df0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20  sk..**.** The m 
4e00: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62  parameter will b
4e10: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  e non-zero only 
4e20: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77  when creating -w
4e30: 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a  al, -journal,.**
4e40: 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e   and -shm files.
4e50: 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20    We want those 
4e60: 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65  files to have *e
4e70: 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65  xactly* the same
4e80: 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  .** permissions 
4e90: 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  as their origina
4ea0: 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64  l database, unad
4eb0: 75 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65  ulterated by the
4ec0: 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68   umask..** In th
4ed0: 61 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74  at way, if a dat
4ee0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72  abase file is -r
4ef0: 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72  w-rw-rw or -rw-r
4f00: 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74  w-r-, and a.** t
4f10: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68  ransaction crash
4f20: 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65  es and leaves be
4f30: 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  hind hot journal
4f40: 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70  s, then any.** p
4f50: 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61  rocess that is a
4f60: 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ble to write to 
4f70: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
4f80: 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74  l also be able t
4f90: 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65  o.** recover the
4fa0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   hot journals..*
4fb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
4fc0: 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ust_open(const c
4fd0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d  har *z, int f, m
4fe0: 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20  ode_t m){.  int 
4ff0: 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20  fd;.  mode_t m2 
5000: 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45  = m ? m : SQLITE
5010: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
5020: 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69  RMISSIONS;.  whi
5030: 6c 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e  le(1){.#if defin
5040: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20  ed(O_CLOEXEC).  
5050: 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c    fd = osOpen(z,
5060: 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b  f|O_CLOEXEC,m2);
5070: 0a 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20  .#else.    fd = 
5080: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a  osOpen(z,f,m2);.
5090: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
50a0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  d<0 ){.      if(
50b0: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20   errno==EINTR ) 
50c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
50d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
50e0: 20 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f   if( fd>=SQLITE_
50f0: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
5100: 43 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b  CRIPTOR ) break;
5110: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29  .    osClose(fd)
5120: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  ;.    sqlite3_lo
5130: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
5140: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
5150: 20 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f     "attempt to o
5160: 70 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69  pen \"%s\" as fi
5170: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64  le descriptor %d
5180: 22 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66  ", z, fd);.    f
5190: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  d = -1;.    if( 
51a0: 6f 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c  osOpen("/dev/nul
51b0: 6c 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72  l", f, m)<0 ) br
51c0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  eak;.  }.  if( f
51d0: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d>=0 ){.    if( 
51e0: 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  m!=0 ){.      st
51f0: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
5200: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
5210: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
5220: 66 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  f)==0 .       &&
5230: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
5240: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73  ==0.       && (s
5250: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30  tatbuf.st_mode&0
5260: 37 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29  777)!=m .      )
5270: 7b 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d  {.        osFchm
5280: 6f 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20  od(fd, m);.     
5290: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66   }.    }.#if def
52a0: 69 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29  ined(FD_CLOEXEC)
52b0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f   && (!defined(O_
52c0: 43 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c  CLOEXEC) || O_CL
52d0: 4f 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73  OEXEC==0).    os
52e0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  Fcntl(fd, F_SETF
52f0: 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  D, osFcntl(fd, F
5300: 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
5310: 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
5320: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64  .  }.  return fd
5330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
5340: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
5350: 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
5360: 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
5370: 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
5380: 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
5390: 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
53a0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
53b0: 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69  and.** vxworksFi
53c0: 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65  leId objects use
53d0: 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20  d by this file, 
53e0: 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
53f0: 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62   be .** shared b
5400: 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
5410: 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
5420: 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  on unixMutexHeld
5430: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
5440: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
5450: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
5460: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
5470: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
5480: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
5490: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
54a0: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
54b0: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
54c0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  *   unixEnterMut
54d0: 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
54e0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
54f0: 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78  d() );.**   unix
5500: 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a  EnterLeave().*/.
5510: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
5520: 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
5530: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
5540: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
5550: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
5560: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46  _MUTEX_STATIC_VF
5570: 53 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  S1));.}.static v
5580: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
5590: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
55a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
55b0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
55c0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
55d0: 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
55e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
55f0: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
5600: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
5610: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
5620: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5630: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
5640: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
5650: 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
5660: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
5670: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f   SQLITE_HAVE_OS_
5680: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  TRACE./*.** Help
5690: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
56a0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
56b0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
56c0: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
56d0: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
56e0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
56f0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
5700: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
5710: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
5720: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
5730: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
5740: 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69  FileLock(int eFi
5750: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63  leLock){.  switc
5760: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
5770: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
5780: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
5790: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
57a0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
57b0: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
57c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
57d0: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
57e0: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
57f0: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
5800: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
5810: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
5820: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
5830: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
5840: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
5850: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
5860: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
5870: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
5880: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
5890: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
58a0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
58b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
58c0: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
58d0: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
58e0: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
58f0: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
5900: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
5910: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
5920: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
5930: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
5940: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
5950: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
5960: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
5970: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
5980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
5990: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
59a0: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
59b0: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
59c0: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
59d0: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
59e0: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
59f0: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
5a00: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
5a10: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
5a20: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
5a30: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
5a40: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
5a50: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46  lse{.    s = osF
5a60: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
5a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
5a80: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
5a90: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
5aa0: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
5ab0: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
5ac0: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
5ad0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
5ae0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
5af0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5b00: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
5b10: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5b20: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
5b30: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
5b40: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
5b50: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
5b60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5b70: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
5b80: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
5b90: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
5ba0: 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28  ;.  s = osFcntl(
5bb0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
5bc0: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
5bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
5be0: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
5bf0: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
5c00: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
5c10: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
5c20: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
5c30: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
5c40: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
5c50: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
5c60: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
5c70: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
5c80: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
5c90: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
5ca0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
5cb0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
5cc0: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
5cd0: 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c   *p;.    osFcntl
5ce0: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
5cf0: 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c  2);.    if( l2.l
5d00: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
5d10: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
5d20: 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "RDLCK";.    }el
5d30: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
5d40: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
5d50: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
5d60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
5d70: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( l2.l_type==F_U
5d80: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  NLCK ){.      zT
5d90: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
5da0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5db0: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
5dc0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
5dd0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
5de0: 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a  -failure-reason:
5df0: 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %s %d %d %d\n",
5e00: 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28  .       zType, (
5e10: 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20  int)l2.l_start, 
5e20: 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28  (int)l2.l_len, (
5e30: 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20  int)l2.l_pid);. 
5e40: 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76   }.  errno = sav
5e50: 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  edErrno;.  retur
5e60: 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73  n s;.}.#undef os
5e70: 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73  Fcntl.#define os
5e80: 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  Fcntl lockTrace.
5e90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5ea0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
5eb0: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75  /*.** Retry ftru
5ec0: 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68  ncate() calls th
5ed0: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
5ee0: 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  INTR.**.** All c
5ef0: 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74  alls to ftruncat
5f00: 65 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20  e() within this 
5f10: 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d  file should be m
5f20: 61 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  ade through.** t
5f30: 68 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e  his wrapper.  On
5f40: 20 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61   the Android pla
5f50: 74 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67  tform, bypassing
5f60: 20 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77   the logic below
5f70: 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  .** could lead t
5f80: 6f 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  o a corrupt data
5f90: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
5fa0: 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  int robust_ftrun
5fb0: 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69  cate(int h, sqli
5fc0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20  te3_int64 sz){. 
5fd0: 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20   int rc;.#ifdef 
5fe0: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a  __ANDROID__.  /*
5ff0: 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72   On Android, ftr
6000: 75 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20  uncate() always 
6010: 75 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73  uses 32-bit offs
6020: 65 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20  ets, even if .  
6030: 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ** _FILE_OFFSET_
6040: 42 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e  BITS=64 is defin
6050: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ed. This means i
6060: 74 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61  t is unsafe to a
6070: 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74  ttempt to.  ** t
6080: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
6090: 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65  o any size large
60a0: 72 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c  r than 2GiB. Sil
60b0: 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79  ently ignore any
60c0: 0a 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d  .  ** such attem
60d0: 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  pts.  */.  if( s
60e0: 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  z>(sqlite3_int64
60f0: 29 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20  )0x7FFFFFFF ){. 
6100: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6110: 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  K;.  }else.#endi
6120: 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46  f.  do{ rc = osF
6130: 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20  truncate(h,sz); 
6140: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
6150: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
6160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6180: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
6190: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
61a0: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
61b0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
61c0: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
61d0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
61e0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
61f0: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
6200: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
6210: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
6220: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
6230: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
6240: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
6250: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
6260: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
6270: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6280: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
6290: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
62a0: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
62b0: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
62c0: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
62d0: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
62e0: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
62f0: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
6300: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
6310: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
6320: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
6330: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6340: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
6350: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
6360: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
6370: 45 72 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28  Err) {.  assert(
6380: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6390: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
63a0: 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  CK) || .        
63b0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
63c0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
63d0: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  NLOCK) || .     
63e0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
63f0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6400: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
6410: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6420: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6430: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
6440: 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74  DLOCK) );.  swit
6450: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
6460: 7b 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a  {.  case EACCES:
6470: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
6480: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
6490: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
64a0: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
64b0: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
64c0: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
64d0: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
64e0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
64f0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
6500: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
6510: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
6520: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
6530: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
6540: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
6550: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
6560: 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20    case EPERM: . 
6570: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6580: 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65  _PERM;.    .  de
6590: 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75  fault: .    retu
65a0: 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a  rn sqliteIOErr;.
65b0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a    }.}.../*******
65c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6600: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
6610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
6620: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
6630: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
6640: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
6650: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
6660: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
6670: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
6680: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
6690: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
66a0: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
66b0: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
66c0: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
66d0: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
66e0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
66f0: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
6700: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
6710: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
6720: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
6730: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
6740: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
6750: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
6760: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6770: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
6780: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
6790: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
67a0: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
67b0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
67c0: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
67d0: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
67e0: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
67f0: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
6800: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
6810: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
6820: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
6830: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
6840: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6850: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
6860: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
6870: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
6880: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
6890: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
68a0: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
68b0: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
68c0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
68d0: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
68e0: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
68f0: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
6900: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
6910: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
6920: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6930: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
6940: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
6950: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
6960: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
6970: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
6980: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
6990: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
69a0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
69b0: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
69c0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
69e0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
69f0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
6a00: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
6a10: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
6a20: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
6a30: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6a40: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
6a50: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
6a60: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
6a70: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
6a80: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
6a90: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
6aa0: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
6ab0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
6ac0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
6ad0: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
6ae0: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
6af0: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
6b00: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
6b10: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
6b20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
6b30: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
6b40: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
6b50: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
6b60: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
6b70: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
6b80: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
6b90: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
6ba0: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
6bb0: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
6bc0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
6bd0: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
6be0: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
6bf0: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
6c00: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
6c10: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
6c20: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
6c30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
6c40: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
6c50: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
6c60: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
6c70: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
6c80: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
6c90: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
6ca0: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
6cb0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
6cc0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
6cd0: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
6ce0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
6cf0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
6d00: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
6d10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
6d20: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6d30: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
6d40: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
6d50: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
6d60: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6d70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
6d80: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
6d90: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
6da0: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
6db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
6dc0: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
6dd0: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
6de0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
6df0: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
6e00: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
6e10: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6e20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
6e30: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
6e40: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
6e50: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
6e60: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
6e70: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
6e80: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
6e90: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
6ea0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
6eb0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
6ec0: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
6ed0: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
6ee0: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
6ef0: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
6f00: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
6f10: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6f20: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
6f30: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
6f40: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
6f50: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
6f60: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6f70: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
6f80: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
6f90: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
6fa0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
6fb0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
6fc0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
6fd0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
6fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
6ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7000: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
7010: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
7020: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
7030: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7040: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
7050: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
7060: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
7070: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
7080: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7090: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
70a0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
70b0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
70c0: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
70f0: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
7100: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
7110: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
7120: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
7130: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
7140: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
7150: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
7160: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7170: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
7180: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
7190: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
71a0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
71b0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
71c0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
71d0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
71e0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
71f0: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
7200: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
7210: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
7220: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7230: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
7240: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
7250: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
7260: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
7270: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
7280: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
7290: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
72a0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
72b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
72c0: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
72d0: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
72e0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
72f0: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
7300: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
7310: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
7320: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
7330: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
7340: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
7350: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
7360: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
7370: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
7380: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
7390: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
73a0: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
73b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
73c0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
73d0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
73e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
73f0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
7400: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
7410: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
7420: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
7430: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
7440: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
7450: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
7460: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
7470: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
7480: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
7490: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
74a0: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
74b0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
74c0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
74d0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
74e0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
74f0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
7500: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
7510: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7520: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
7530: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
7540: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
7550: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
7560: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
7570: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
7580: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7590: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
75a0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
75b0: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
75c0: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
75d0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
75e0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
75f0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7600: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
7610: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
7620: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
7630: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
7640: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
7650: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
7660: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
7670: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
7680: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7690: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
76a0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
76b0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
76c0: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
76e0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
76f0: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
7700: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
7710: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7760: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
77e0: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
7810: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
7820: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
7830: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
7840: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
7850: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
7860: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
7870: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
7880: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
7890: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
78a0: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
78b0: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
78c0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
78d0: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
78e0: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
78f0: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
7900: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
7910: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
7920: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
7930: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
7940: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
7950: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
7960: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
7970: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
7980: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
7990: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
79a0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
79b0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
79c0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
79d0: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
79e0: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
79f0: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
7a00: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
7a10: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
7a20: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
7a30: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
7a40: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
7a50: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
7a60: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
7a70: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
7a80: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
7a90: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
7aa0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
7ab0: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
7ac0: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
7ad0: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
7ae0: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
7af0: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
7b00: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
7b10: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
7b20: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
7b30: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
7b40: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
7b50: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
7b60: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
7b70: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
7b80: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
7b90: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
7ba0: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
7bb0: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
7bc0: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
7bd0: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
7be0: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
7bf0: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
7c00: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
7c10: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
7c20: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
7c30: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
7c40: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
7c50: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
7c60: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
7c70: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
7c80: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
7c90: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
7ca0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
7cb0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
7cc0: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
7cd0: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
7ce0: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
7cf0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
7d00: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
7d10: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
7d20: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
7d30: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
7d40: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
7d50: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
7d60: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
7d70: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
7d80: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
7d90: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
7da0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
7db0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7dc0: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
7dd0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7de0: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
7df0: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
7e00: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
7e10: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
7e20: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
7e30: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
7e40: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
7e50: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
7e60: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
7e70: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
7e80: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
7e90: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
7ea0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
7eb0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
7ec0: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
7ed0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
7ee0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
7ef0: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
7f00: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
7f10: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
7f20: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
7f30: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
7f40: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
7f50: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
7f60: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
7f70: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
7f80: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
7f90: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
7fa0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
7fb0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
7fc0: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
7fd0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
7fe0: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
7ff0: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
8000: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
8010: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
8020: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
8030: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8040: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
8050: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
8060: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
8070: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
8080: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
8090: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
80a0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
80b0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
80c0: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
80d0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
80e0: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
80f0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8100: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
8110: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
8120: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
8130: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
8140: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
8150: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
8160: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
8170: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
8180: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
8190: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
81a0: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
81b0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
81c0: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
81d0: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
81e0: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
81f0: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
8200: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
8210: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
8220: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
8230: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
8240: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
8250: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
8260: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
8270: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
8280: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
8290: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
82a0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
82b0: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
82c0: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
82d0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
82e0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
82f0: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
8300: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
8310: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
8320: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
8330: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
8340: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
8350: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
8360: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
8370: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
8380: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
8390: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
83a0: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
83b0: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
83c0: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
83d0: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
83e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
83f0: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
8400: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
8410: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
8420: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
8430: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
8440: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
8450: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
8460: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
8470: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
8480: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
8490: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
84a0: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
84b0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
84c0: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
84d0: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
84e0: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
84f0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
8500: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
8510: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
8520: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
8530: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
8540: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
8550: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
8560: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
8570: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
8580: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
8590: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
85a0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
85b0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
85c0: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
85d0: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
85e0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
85f0: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
8600: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
8610: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
8620: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
8630: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
8640: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
8650: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
8660: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
8670: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
8680: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
8690: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
86a0: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
86b0: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
86c0: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
86d0: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
86e0: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
86f0: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
8700: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
8710: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
8720: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
8730: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
8740: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
8750: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
8760: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
8770: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
8780: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
8790: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
87a0: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
87b0: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
87c0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
87d0: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
87e0: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
87f0: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
8800: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
8810: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
8820: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
8830: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
8840: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
8850: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
8860: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
8870: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
8880: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
8890: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
88a0: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
88b0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
88c0: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
88d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
88e0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
88f0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
8900: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
8910: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
8920: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
8930: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
8940: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
8950: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
8960: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
8970: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
8980: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
8990: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
89a0: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
89b0: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
89c0: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
89d0: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
89e0: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
89f0: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
8a00: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
8a10: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
8a20: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
8a30: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
8a40: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
8a50: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
8a60: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
8a70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
8a80: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
8a90: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
8aa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
8ab0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
8ac0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
8ad0: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
8ae0: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
8af0: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
8b00: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
8b10: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
8b20: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
8b30: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b50: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
8b60: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
8b70: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
8b80: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
8b90: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
8ba0: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
8bb0: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
8bc0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
8bd0: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
8be0: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
8bf0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
8c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
8c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
8c20: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
8c30: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
8c40: 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75  de.  Or, on Linu
8c50: 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20  xThreads, there 
8c60: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  is one of these 
8c70: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a  structures for.*
8c80: 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65  * each inode ope
8c90: 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65  ned by each thre
8ca0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  ad..**.** A sing
8cb0: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
8cc0: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
8cd0: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
8ce0: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  each unixFile.**
8cf0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
8d00: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
8d10: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
8d20: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
8d30: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
8d40: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
8d50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
8d60: 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20  ixFile pointing 
8d70: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
8d80: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b   unixInodeInfo {
8d90: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
8da0: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
8db0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
8dc0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   key */.  int nS
8dd0: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  hared;          
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8df0: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
8e00: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e  cks held */.  un
8e10: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
8e20: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  eLock;        /*
8e30: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
8e40: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
8e50: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73  CK etc. */.  uns
8e60: 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63  igned char bProc
8e70: 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  essLock;     /* 
8e80: 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f  An exclusive pro
8e90: 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c  cess lock is hel
8ea0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  d */.  int nRef;
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8ed0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
8ee0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8ef0: 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
8f00: 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
8f10: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
8f20: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
8f30: 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20  with this inode 
8f40: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20  */.  int nLock; 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8f70: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69  f outstanding fi
8f80: 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e  le locks */.  Un
8f90: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
8fa0: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sed;          /*
8fb0: 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   Unused file des
8fc0: 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73  criptors to clos
8fd0: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
8fe0: 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20  Info *pNext;    
8ff0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
9000: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
9010: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  nfo objects */. 
9020: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9030: 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  pPrev;          
9040: 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62   /*    .... doub
9050: 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66  ly linked */.#if
9060: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
9070: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75  OCKING_STYLE.  u
9080: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
9090: 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f  g sharedByte;  /
90a0: 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61  * for AFP simula
90b0: 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ted shared lock 
90c0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
90d0: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
90e0: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
90f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
9100: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
9110: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
9120: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
9130: 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65  AME+2];  /* Name
9140: 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f   of that semapho
9150: 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  re */.#endif.};.
9160: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f  ./*.** A lists o
9170: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
9180: 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  nfo objects..*/.
9190: 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65  static unixInode
91a0: 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20  Info *inodeList 
91b0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  = 0;../*.**.** T
91c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75  his function - u
91d0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
91e0: 65 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65  e(), is only eve
91f0: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
9200: 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f   macro.** unixLo
9210: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
9220: 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  It is invoked af
9230: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
9240: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
9250: 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20  ction and errno 
9260: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e  has been.** set.
9270: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
9280: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
9290: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
92a0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
92b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20  lue of.** errno 
92c0: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
92d0: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
92e0: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
92f0: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
9300: 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  or.** strerror_r
9310: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
9320: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
9330: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
9340: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
9350: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
9360: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
9370: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
9380: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
9390: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
93a0: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
93b0: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
93c0: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
93d0: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
93e0: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
93f0: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
9400: 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20  (e.g. "unlink", 
9410: 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20  "open") and the 
9420: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
9430: 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20  system path,.** 
9440: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69  if any..*/.#defi
9450: 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ne unixLogError(
9460: 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c  a,b,c)     unixL
9470: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
9480: 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74  b,c,__LINE__).st
9490: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67  atic int unixLog
94a0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
94b0: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
94d0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
94e0: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
94f0: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
9500: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9510: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
9520: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
9530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
9540: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
9550: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
9560: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
9570: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
9580: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
9590: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
95a0: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
95b0: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
95c0: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
95d0: 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20   *zErr;         
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
95f0: 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65  essage from stre
9600: 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61  rror() or equiva
9610: 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45  lent */.  int iE
9620: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20  rrno = errno;   
9630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
9640: 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72  ed syscall error
9650: 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a   number */..  /*
9660: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
9670: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9680: 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ld (SQLITE_THREA
9690: 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20  DSAFE==0), then 
96a0: 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72  use.  ** the str
96b0: 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e  error() function
96c0: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68   to obtain the h
96d0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72  uman-readable er
96e0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
96f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65   equivalent to e
9700: 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c  rrno. Otherwise,
9710: 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28   use strerror_r(
9720: 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c  )..  */ .#if SQL
9730: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
9740: 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53  & defined(HAVE_S
9750: 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61  TRERROR_R).  cha
9760: 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65  r aErr[80];.  me
9770: 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69  mset(aErr, 0, si
9780: 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a  zeof(aErr));.  z
9790: 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f  Err = aErr;..  /
97a0: 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f  * If STRERROR_R_
97b0: 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20 61  CHAR_P (set by a
97c0: 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29  utoconf scripts)
97d0: 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73   or __USE_GNU is
97e0: 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61   defined,.  ** a
97f0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
9800: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
9810: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f  he GNU version o
9820: 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74  f strerror_r() t
9830: 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  hat.  ** returns
9840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
9850: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
9860: 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  g the error mess
9870: 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65  age. That pointe
9880: 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e  r .  ** may poin
9890: 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20  t to aErr[], or 
98a0: 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  it may point to 
98b0: 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72  some static stor
98c0: 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a  age somewhere. .
98d0: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
98e0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
98f0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
9900: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
9910: 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72  n of .  ** strer
9920: 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61  ror_r(), which a
9930: 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20  lways writes an 
9940: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9950: 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a  to aErr[]..  **.
9960: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65    ** If the code
9970: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73   incorrectly ass
9980: 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
9990: 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f  the POSIX versio
99a0: 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61  n that is.  ** a
99b0: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72  vailable, the er
99c0: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
99d0: 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70   often be an emp
99e0: 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61  ty string. Not a
99f0: 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c  .  ** huge probl
9a00: 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20  em. Incorrectly 
9a10: 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20  concluding that 
9a20: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9a30: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20  is available .  
9a40: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
9a50: 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75   a segfault thou
9a60: 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  gh..  */.#if def
9a70: 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f  ined(STRERROR_R_
9a80: 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e  CHAR_P) || defin
9a90: 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20  ed(__USE_GNU).  
9aa0: 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a  zErr = .# endif.
9ab0: 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72    strerror_r(iEr
9ac0: 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f  rno, aErr, sizeo
9ad0: 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c  f(aErr)-1);..#el
9ae0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
9af0: 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69  SAFE.  /* This i
9b00: 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  s a threadsafe b
9b10: 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72  uild, but strerr
9b20: 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76  or_r() is not av
9b30: 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45  ailable. */.  zE
9b40: 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20  rr = "";.#else. 
9b50: 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61   /* Non-threadsa
9b60: 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74  fe build, use st
9b70: 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a  rerror(). */.  z
9b80: 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69  Err = strerror(i
9b90: 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  Errno);.#endif..
9ba0: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
9bb0: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73   zPath = "";.  s
9bc0: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
9bd0: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e  de,.      "os_un
9be0: 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73  ix.c:%d: (%d) %s
9bf0: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
9c00: 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c    iLine, iErrno,
9c10: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
9c20: 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Err.  );..  retu
9c30: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
9c40: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
9c50: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
9c60: 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68  .** We assume th
9c70: 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73  at close() almos
9c80: 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20  t always works, 
9c90: 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79  since it is only
9ca0: 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69   in a.** very si
9cb0: 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f  ck application o
9cc0: 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b  r on a very sick
9cd0: 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69   platform that i
9ce0: 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a  t might fail..**
9cf0: 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c   If it does fail
9d00: 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68  , simply leak th
9d10: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9d20: 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68  r, but do log th
9d30: 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  e.** error..**.*
9d40: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  * Note that it i
9d50: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65  s not safe to re
9d60: 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65  try close() afte
9d70: 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68  r EINTR since th
9d80: 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  e.** file descri
9d90: 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20  ptor might have 
9da0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75  already been reu
9db0: 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74  sed by another t
9dc0: 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20  hread..** So we 
9dd0: 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74  don't even try t
9de0: 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
9df0: 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c  n EINTR.  Just l
9e00: 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  og the error.** 
9e10: 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a  and move on..*/.
9e20: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75  static void robu
9e30: 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c  st_close(unixFil
9e40: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c  e *pFile, int h,
9e50: 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20   int lineno){.  
9e60: 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29  if( osClose(h) )
9e70: 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  {.    unixLogErr
9e80: 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f  orAtLine(SQLITE_
9e90: 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c  IOERR_CLOSE, "cl
9ea0: 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ose",.          
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
9ec0: 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le ? pFile->zPat
9ed0: 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  h : 0, lineno);.
9ee0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
9ef0: 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74   the pFile->last
9f00: 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20  Errno.  Do this 
9f10: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
9f20: 61 73 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  as that provides
9f30: 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  .** a convenient
9f40: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
9f50: 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  breakpoint..*/.s
9f60: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
9f70: 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46 69  LastErrno(unixFi
9f80: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
9f90: 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e  rror){.  pFile->
9fa0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f  lastErrno = erro
9fb0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  r;.}../*.** Clos
9fc0: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
9fd0: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
9fe0: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  d in the unixIno
9ff0: 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20  deInfo->pUnused 
a000: 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  list..*/ .static
a010: 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69   void closePendi
a020: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
a030: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
a040: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a050: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
a060: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
a070: 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  *p;.  UnixUnused
a080: 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  Fd *pNext;.  for
a090: 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  (p=pInode->pUnus
a0a0: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
a0b0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
a0c0: 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73  pNext;.    robus
a0d0: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
a0e0: 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ->fd, __LINE__);
a0f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a100: 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f  e(p);.  }.  pIno
a110: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  de->pUnused = 0;
a120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
a130: 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  e a unixInodeInf
a140: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
a150: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
a160: 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   by findInodeInf
a170: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  o()..**.** The m
a180: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
a190: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
a1a0: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
a1b0: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
a1c0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
a1d0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
a1e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
a1f0: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75  leaseInodeInfo(u
a200: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
a210: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a220: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a230: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
a240: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
a250: 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  d() );.  if( ALW
a260: 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20  AYS(pInode) ){. 
a270: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d     pInode->nRef-
a280: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
a290: 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
a2b0: 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  de->pShmNode==0 
a2c0: 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65  );.      closePe
a2d0: 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
a2e0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
a2f0: 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  e->pPrev ){.    
a300: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
a310: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
a320: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
a330: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
a340: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  v->pNext = pInod
a350: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a360: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
a370: 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74  ssert( inodeList
a380: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
a390: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
a3a0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
a3b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a3c0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29   pInode->pNext )
a3d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a3e0: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d  ( pInode->pNext-
a3f0: 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29  >pPrev==pInode )
a400: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
a410: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
a420: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a   pInode->pPrev;.
a430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a440: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64  lite3_free(pInod
a450: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
a460: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
a470: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
a480: 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49  locate the unixI
a490: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a4a0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
a4b0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
a4c0: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
a4d0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
a4e0: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
a4f0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67  return value mig
a500: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
a510: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
a520: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
a530: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
a540: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
a550: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
a560: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
a570: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
a580: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a590: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
a5a0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
a5b0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
a5c0: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
a5d0: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
a5e0: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
a5f0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
a600: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
a610: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
a620: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
a630: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
a640: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a650: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
a660: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
a670: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
a6a0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
a6b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
a6e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
a6f0: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
a700: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
a710: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
a720: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
a730: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a740: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
a750: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
a760: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
a770: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
a780: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
a790: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
a7a0: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
a7b0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
a7c0: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
a7d0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
a7e0: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
a7f0: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
a800: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
a810: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
a820: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
a830: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
a840: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
a850: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
a860: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
a870: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
a880: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
a890: 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
a8a0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
a8b0: 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69  errno);.#if defi
a8c0: 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26  ned(EOVERFLOW) &
a8d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
a8e0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20  _DISABLE_LFS).  
a8f0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
a900: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
a910: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
a920: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
a930: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a940: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
a950: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
a960: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
a970: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
a980: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
a990: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
a9a0: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
a9b0: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
a9c0: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
a9d0: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
a9e0: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
a9f0: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
aa00: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
aa10: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
aa20: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
aa30: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
aa40: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
aa50: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
aa60: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
aa70: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
aa80: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
aa90: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
aaa0: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
aab0: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
aac0: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
aad0: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
aae0: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
aaf0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
ab00: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
ab10: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
ab20: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
ab30: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
ab40: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
ab50: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
ab60: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
ab70: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
ab80: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
ab90: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
aba0: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
abb0: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
abc0: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
abd0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
abe0: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
abf0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
ac00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
ac10: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
ac20: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
ac30: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
ac40: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
ac50: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
ac60: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
ac70: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
ac80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ac90: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
aca0: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
acb0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
acc0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
acd0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
ace0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
acf0: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
ad00: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
ad10: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ad20: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65  ..  memset(&file
ad30: 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  Id, 0, sizeof(fi
ad40: 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64  leId));.  fileId
ad50: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
ad60: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
ad70: 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70  WORKS.  fileId.p
ad80: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
ad90: 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e  .#else.  fileId.
ada0: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
adb0: 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70  _ino;.#endif.  p
adc0: 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
add0: 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  t;.  while( pIno
ade0: 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  de && memcmp(&fi
adf0: 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66  leId, &pInode->f
ae00: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
ae10: 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49  leId)) ){.    pI
ae20: 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
ae30: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
ae40: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
ae50: 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65   pInode = sqlite
ae60: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
ae70: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
ae80: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
ae90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
aea0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
aeb0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
aec0: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
aed0: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
aee0: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
aef0: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
af00: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
af10: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
af20: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
af30: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
af40: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
af50: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
af60: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
af70: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
af80: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
af90: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
afa0: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
afb0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
afc0: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
afd0: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
afe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
aff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b000: 54 52 55 45 20 69 66 20 70 46 69 6c 65 20 68 61  TRUE if pFile ha
b010: 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  s been renamed o
b020: 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65  r unlinked since
b030: 20 69 74 20 77 61 73 20 66 69 72 73 74 20 6f 70   it was first op
b040: 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ened..*/.static 
b050: 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  int fileHasMoved
b060: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
b070: 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
b080: 53 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  S.  return pFile
b090: 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 20 70  ->pInode!=0 && p
b0a0: 46 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65  File->pId!=pFile
b0b0: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
b0c0: 2e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74  .pId;.#else.  st
b0d0: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
b0e0: 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70   return pFile->p
b0f0: 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20 20 20  Inode!=0 &&.    
b100: 20 20 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d    (osStat(pFile-
b110: 3e 7a 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30  >zPath, &buf)!=0
b120: 20 7c 7c 20 62 75 66 2e 73 74 5f 69 6e 6f 21 3d   || buf.st_ino!=
b130: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
b140: 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64  ileId.ino);.#end
b150: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
b160: 63 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68  ck a unixFile th
b170: 61 74 20 69 73 20 61 20 64 61 74 61 62 61 73 65  at is a database
b180: 2e 20 20 56 65 72 69 66 79 20 74 68 65 20 66 6f  .  Verify the fo
b190: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28  llowing:.**.** (
b1a0: 31 29 20 54 68 65 72 65 20 69 73 20 65 78 61 63  1) There is exac
b1b0: 74 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e  tly one hard lin
b1c0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  k on the file.**
b1d0: 20 28 32 29 20 54 68 65 20 66 69 6c 65 20 69 73   (2) The file is
b1e0: 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20   not a symbolic 
b1f0: 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20  link.** (3) The 
b200: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
b210: 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c  n renamed or unl
b220: 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75  inked.**.** Issu
b230: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51  e sqlite3_log(SQ
b240: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e  LITE_WARNING,...
b250: 29 20 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e  ) messages if an
b260: 79 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69  ything is not ri
b270: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ght..*/.static v
b280: 6f 69 64 20 76 65 72 69 66 79 44 62 46 69 6c 65  oid verifyDbFile
b290: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
b2a0: 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
b2b0: 20 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   buf;.  int rc;.
b2c0: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70    rc = osFstat(p
b2d0: 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  File->h, &buf);.
b2e0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
b2f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b300: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
b310: 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64 62 20  cannot fstat db 
b320: 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c 65 2d  file %s", pFile-
b330: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74  >zPath);.    ret
b340: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  urn;.  }.  if( b
b350: 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 26  uf.st_nlink==0 &
b360: 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  & (pFile->ctrlFl
b370: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
b380: 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
b390: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b3a0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
b3b0: 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c  le unlinked whil
b3c0: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
b3d0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b3e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b3f0: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31  ( buf.st_nlink>1
b400: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b410: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b420: 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69  NG, "multiple li
b430: 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22  nks to file: %s"
b440: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b450: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b460: 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f  .  if( fileHasMo
b470: 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ved(pFile) ){.  
b480: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b490: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
b4a0: 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c  ile renamed whil
b4b0: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
b4c0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b4d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a  return;.  }.}...
b4e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b4f0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
b500: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
b510: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
b520: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
b530: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
b540: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
b550: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
b560: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
b570: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
b580: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
b590: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
b5a0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
b5b0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
b5c0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
b5d0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
b5e0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
b5f0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
b600: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
b610: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
b620: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
b630: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
b640: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
b650: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b660: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
b670: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
b680: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
b690: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
b6a0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
b6b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
b6c0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
b6d0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
b6e0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
b6f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
b700: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
b710: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69 78  D_LOCK );.  unix
b720: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
b730: 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
b740: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
b750: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
b760: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
b770: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
b780: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
b790: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
b7a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
b7b0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
b7c0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
b7d0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
b7e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
b7f0: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
b800: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
b810: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  lds it..  */.#if
b820: 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  ndef __DJGPP__. 
b830: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26   if( !reserved &
b840: 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  & !pFile->pInode
b850: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29  ->bProcessLock )
b860: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
b870: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
b880: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
b890: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
b8a0: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
b8b0: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
b8c0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
b8d0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
b8e0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _WRLCK;.    if( 
b8f0: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
b900: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
b910: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
b920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
b930: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a  CKRESERVEDLOCK;.
b940: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
b950: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
b960: 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  o);.    } else i
b970: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
b980: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
b990: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
b9a0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
b9b0: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
b9c0: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
b9d0: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
b9e0: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
b9f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
ba00: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
ba10: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
ba20: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
ba30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
ba40: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
ba50: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
ba60: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
ba70: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
ba80: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
ba90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
baa0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
bab0: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
bac0: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
bad0: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
bae0: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
baf0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
bb00: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
bb10: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
bb20: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
bb30: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
bb40: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
bb50: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
bb60: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
bb70: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
bb80: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
bb90: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
bba0: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
bbb0: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
bbc0: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
bbd0: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
bbe0: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
bbf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
bc00: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
bc10: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
bc20: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
bc30: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
bc40: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
bc50: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
bc60: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
bc70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bc80: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
bc90: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
bca0: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
bcb0: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
bcc0: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
bcd0: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
bce0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
bcf0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
bd00: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
bd10: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
bd20: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
bd30: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
bd40: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
bd50: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
bd60: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
bd70: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
bd80: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
bd90: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
bda0: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
bdb0: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
bdc0: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
bdd0: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
bde0: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
bdf0: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
be00: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
be10: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
be20: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
be30: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73  xHeld() );.  ass
be40: 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29  ert( pInode!=0 )
be50: 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  ;.  if( (pFile->
be60: 63 74 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49  ctrlFlags & (UNI
be70: 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46  XFILE_EXCL|UNIXF
be80: 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e  ILE_RDONLY))==UN
be90: 49 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20  IXFILE_EXCL ){. 
bea0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
beb0: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
bec0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
bed0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
bee0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
bef0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
bf00: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
bf10: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bf20: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
bf30: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
bf40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
bf50: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
bf60: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
bf70: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
bf80: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
bf90: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bfa0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
bfb0: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
bfc0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
bfd0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bfe0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
bff0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
c000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c010: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
c020: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
c030: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
c040: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
c050: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c060: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
c070: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
c080: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
c090: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
c0a0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
c0b0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
c0c0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
c0d0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
c0e0: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
c0f0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
c100: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
c110: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
c120: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
c130: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
c140: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
c150: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
c160: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
c170: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
c180: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
c190: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
c1a0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
c1b0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
c1c0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
c1d0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
c1e0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
c1f0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
c200: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
c210: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
c220: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
c230: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
c240: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
c250: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
c260: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
c270: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
c280: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
c290: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
c2a0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
c2b0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
c2c0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
c2d0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
c2e0: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
c2f0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c300: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
c310: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
c320: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c330: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
c340: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
c350: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
c360: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
c370: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
c380: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
c390: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
c3a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c3b0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
c3c0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
c3d0: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
c3e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c3f0: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
c400: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
c410: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
c420: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
c430: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
c440: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
c450: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
c460: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
c470: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
c480: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
c490: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
c4a0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
c4b0: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
c4c0: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
c4d0: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
c4e0: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
c4f0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
c500: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77  ompatible with w
c510: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
c520: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
c530: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
c540: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
c550: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
c560: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
c570: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
c580: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
c590: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
c5a0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c5b0: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
c5c0: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
c5d0: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
c5e0: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
c5f0: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
c600: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
c610: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
c620: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
c630: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
c640: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
c650: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
c660: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
c670: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
c680: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
c690: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
c6a0: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
c6b0: 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d  essful, a random
c6c0: 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27   byte from the '
c6d0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
c6e0: 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d   range' is read-
c6f0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c  locked and the l
c700: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
c710: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
c720: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ed..  **.  ** A 
c730: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
c740: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
c750: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
c760: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
c770: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
c780: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
c790: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
c7a0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
c7b0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
c7c0: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
c7d0: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
c7e0: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
c7f0: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
c800: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
c810: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
c820: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
c830: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
c840: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
c850: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
c860: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
c870: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
c880: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
c890: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
c8a0: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
c8b0: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
c8c0: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
c8d0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
c8e0: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
c8f0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
c900: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
c910: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
c920: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
c930: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
c940: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
c950: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
c960: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
c970: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
c980: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
c990: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
c9a0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
c9b0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
c9c0: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
c9d0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c9e0: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
c9f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
ca00: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
ca10: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
ca20: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
ca30: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
ca40: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
ca50: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
ca60: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
ca70: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
ca80: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
ca90: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
caa0: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
cab0: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
cac0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
cad0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
cae0: 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c  e reason a singl
caf0: 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65  e byte cannot be
cb00: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
cb10: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
cb20: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
cb30: 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69   that some versi
cb40: 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64  ons of windows d
cb50: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65  o not support re
cb60: 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a  ad-locks. By.  *
cb70: 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64  * locking a rand
cb80: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72  om byte from a r
cb90: 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  ange, concurrent
cba0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61   SHARED locks ma
cbb0: 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65  y exist.  ** eve
cbc0: 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n if the locking
cbd0: 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
cbe0: 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74  is always a writ
cbf0: 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  e-lock..  */.  i
cc00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cc10: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
cc20: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
cc30: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
cc40: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
cc50: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
cc60: 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f  ck;.  int tErrno
cc70: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
cc80: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
cc90: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
cca0: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
ccb0: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
ccc0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
ccd0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
cce0: 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
ccf0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
cd00: 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61  leLock),.      a
cd10: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
cd20: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
cd30: 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ck), pFile->pIno
cd40: 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
cd50: 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29     osGetpid(0)))
cd60: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
cd70: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
cd80: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
cd90: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
cda0: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
cdb0: 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  unixFile, do not
cdc0: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
cdd0: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
cde0: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
cdf0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
ce00: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
ce10: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
ce20: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
ce30: 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
ce40: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
ce50: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
ce60: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
ce70: 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  ) (unix)\n", pFi
ce80: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
ce90: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
cea0: 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
ceb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cec0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
ced0: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
cee0: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
cef0: 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29  rrect..  **  (1)
cf00: 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
cf10: 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
cf20: 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
cf30: 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
cf40: 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
cf50: 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
cf60: 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
cf70: 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
cf80: 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
cf90: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
cfa0: 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
cfb0: 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
cfc0: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
cfd0: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
cfe0: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
cff0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
d000: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
d010: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
d020: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
d030: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
d040: 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
d050: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
d060: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d070: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
d080: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
d090: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
d0a0: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
d0b0: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
d0c0: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
d0d0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
d0e0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
d0f0: 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
d100: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
d110: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
d120: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
d130: 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
d140: 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
d150: 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
d160: 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
d170: 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
d180: 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
d190: 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
d1a0: 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
d1b0: 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
d1c0: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
d1d0: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
d1e0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
d1f0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  )).  ){.    rc =
d200: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
d210: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
d220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
d230: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
d240: 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
d250: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
d260: 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
d270: 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
d280: 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
d290: 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
d2a0: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
d2b0: 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
d2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
d2d0: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
d2e0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d2f0: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e  K && .      (pIn
d300: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d310: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
d320: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d330: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
d340: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d350: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d360: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
d370: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
d380: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
d390: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d3a0: 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
d3b0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
d3c0: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
d3d0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
d3e0: 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
d3f0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
d400: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
d410: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45  .  }...  /* A PE
d420: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
d430: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
d440: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
d450: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
d460: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
d470: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
d480: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
d490: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
d4a0: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
d4b0: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
d4c0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
d4d0: 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63  ;.  lock.l_whenc
d4e0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d4f0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d500: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
d510: 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
d520: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
d530: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
d540: 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
d550: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
d560: 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c  l_type = (eFileL
d570: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d580: 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
d590: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
d5a0: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
d5b0: 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  TE;.    if( unix
d5c0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
d5d0: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
d5e0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d5f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d600: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
d610: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
d620: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
d630: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d640: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
d650: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
d660: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
d670: 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
d680: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
d690: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
d6a0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
d6b0: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
d6c0: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
d6d0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
d6e0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
d6f0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
d700: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
d710: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
d720: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
d730: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
d740: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
d750: 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
d760: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d770: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
d780: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
d790: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
d7a0: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
d7b0: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
d7c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d7d0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d7e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d7f0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
d800: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
d810: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
d820: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
d830: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d840: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
d850: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
d860: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
d870: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  ERR_LOCK);.    }
d880: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
d890: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
d8a0: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
d8b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d8c0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d8d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
d8e0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
d8f0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
d900: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d910: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d920: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
d930: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
d940: 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
d950: 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
d960: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72  unt */.      tEr
d970: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d980: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
d990: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
d9a0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20    }..    if( rc 
d9b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ){.      if( rc!
d9c0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
d9d0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
d9e0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
d9f0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rrno);.      }. 
da00: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
da10: 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
da20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
da30: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
da40: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
da50: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
da60: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
da70: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
da80: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
da90: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
daa0: 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
dab0: 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
dac0: 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
dad0: 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
dae0: 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
daf0: 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
db00: 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f  .    ** same pro
db10: 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
db20: 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
db30: 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
db40: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
db50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
db60: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
db70: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
db80: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
db90: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
dba0: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
dbb0: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
dbc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
dbd0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
dbe0: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
dbf0: 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
dc00: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
dc10: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
dc20: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20  pe = F_WRLCK;.. 
dc30: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
dc40: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
dc50: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
dc60: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
dc70: 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c   );.    if( eFil
dc80: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
dc90: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
dca0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
dcb0: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
dcc0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
dcd0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
dce0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
dcf0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
dd00: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
dd10: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
dd20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
dd30: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
dd40: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
dd50: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
dd60: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
dd70: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
dd80: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
dd90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
dda0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
ddb0: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
ddc0: 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
ddd0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
dde0: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
ddf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23  .    }.  }.  ..#
de00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
de10: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
de20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
de30: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
de40: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
de50: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
de60: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
de70: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
de80: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
de90: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
dea0: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
deb0: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
dec0: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
ded0: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
dee0: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
def0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
df00: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
df10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
df20: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
df30: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
df40: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
df50: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
df60: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
df70: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
df80: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
df90: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
dfa0: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
dfb0: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
dfc0: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
dfd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dfe0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
dff0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e000: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e010: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
e020: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
e030: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
e040: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
e050: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
e060: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
e070: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e080: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
e090: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
e0a0: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
e0b0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
e0c0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e0d0: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
e0e0: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
e0f0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
e100: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
e110: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
e120: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
e130: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e140: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
e150: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
e160: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
e170: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
e180: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
e190: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
e1a0: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
e1b0: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
e1c0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
e1d0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
e1e0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
e1f0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
e200: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
e210: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
e220: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
e230: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
e240: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
e250: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
e260: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
e270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
e280: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e290: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
e2a0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
e2b0: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
e2c0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
e2d0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e2e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
e2f0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
e300: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
e310: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e320: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
e330: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
e340: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
e350: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
e360: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
e370: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
e380: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
e390: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
e3a0: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
e3b0: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
e3c0: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
e3d0: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
e3e0: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
e3f0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
e400: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
e410: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
e420: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
e430: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
e440: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
e450: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
e460: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
e470: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
e480: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
e490: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
e4a0: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
e4b0: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
e4c0: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
e4d0: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
e4e0: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
e4f0: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
e500: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e510: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
e520: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
e530: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
e540: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e550: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
e560: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
e570: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
e580: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
e590: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
e5a0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
e5b0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
e5c0: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
e5d0: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
e5e0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
e5f0: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
e600: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
e610: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
e620: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
e630: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
e640: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
e650: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
e660: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
e670: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
e680: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
e690: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
e6a0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
e6b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e6c0: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
e6d0: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
e6e0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e6f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
e700: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
e710: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
e720: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
e730: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
e740: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
e750: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
e760: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
e770: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e780: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
e790: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
e7a0: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
e7b0: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
e7c0: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
e7d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e7e0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
e7f0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
e800: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
e810: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
e820: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
e830: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
e840: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
e850: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
e860: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e870: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
e880: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
e890: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
e8a0: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
e8b0: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
e8c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
e8d0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
e8e0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
e8f0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
e900: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
e910: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
e920: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
e930: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
e940: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
e950: 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
e960: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
e970: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
e980: 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
e990: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
e9a0: 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
e9b0: 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
e9c0: 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
e9d0: 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
e9e0: 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
e9f0: 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
ea00: 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
ea10: 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
ea20: 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
ea30: 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
ea40: 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
ea50: 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
ea60: 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
ea70: 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
ea80: 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
ea90: 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
eaa0: 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
eab0: 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
eac0: 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
ead0: 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
eae0: 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
eaf0: 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
eb00: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
eb10: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69  HARED_LOCK ){.#i
eb20: 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
eb30: 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
eb40: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
eb50: 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
eb60: 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
eb70: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
eb80: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
eb90: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
eba0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
ebb0: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
ebc0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
ebd0: 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
ebe0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
ebf0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
ec00: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
ec10: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
ec20: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
ec30: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
ec40: 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
ec50: 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
ec60: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
ec70: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
ec80: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
ec90: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
eca0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
ecb0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
ecc0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
ecd0: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
ece0: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
ecf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
ed00: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
ed10: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
ed20: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
ed30: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
ed40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ed50: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
ed60: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
ed70: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
ed80: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
ed90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
eda0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
edb0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
edc0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
edd0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
ede0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
edf0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
ee00: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
ee10: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
ee20: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
ee30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
ee40: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
ee50: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
ee60: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
ee70: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
ee80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ee90: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
eea0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
eeb0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
eec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
eed0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
eee0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
eef0: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
ef00: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
ef10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ef20: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
ef30: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
ef40: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
ef50: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
ef60: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
ef70: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
ef80: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
ef90: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
efa0: 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
efb0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
efc0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
efd0: 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
efe0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
eff0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f000: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f010: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f020: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f030: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f040: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f050: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f060: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f070: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f080: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f090: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f0a0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
f0b0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
f0c0: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
f0d0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
f0e0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
f0f0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f100: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
f110: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f120: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
f130: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f140: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
f150: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
f160: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
f170: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
f180: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f190: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
f1a0: 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
f1b0: 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  y, the call to u
f1c0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61  nixFileLock() ca
f1d0: 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73  nnot fail becaus
f1e0: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20  e another.      
f1f0: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69      ** process i
f200: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63  s holding an inc
f210: 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20  ompatible lock. 
f220: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73  If it does, this
f230: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
f240: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
f250: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
f260: 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
f270: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20   the locking.   
f280: 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63         ** protoc
f290: 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ol. If this happ
f2a0: 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ens, return SQLI
f2b0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e  TE_IOERR_RDLOCK.
f2c0: 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   Returning.     
f2d0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42       ** SQLITE_B
f2e0: 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73  USY would confus
f2f0: 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  e the upper laye
f300: 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69  r (in practice i
f310: 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20  t causes .      
f320: 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74      ** an assert
f330: 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20   to fail). */ . 
f340: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
f350: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
f360: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  K;.          sto
f370: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
f380: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
f390: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f3a0: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
f3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f3c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f3d0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
f3e0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f3f0: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
f400: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
f410: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
f420: 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
f430: 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
f440: 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
f450: 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
f460: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f470: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
f480: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
f490: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
f4a0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
f4b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f4c0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f4d0: 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
f4e0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
f4f0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rno);.      goto
f500: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f510: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
f520: 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
f530: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
f540: 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
f550: 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
f560: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
f570: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
f580: 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
f590: 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
f5a0: 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
f5b0: 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
f5c0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
f5d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
f5e0: 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
f5f0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
f600: 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
f610: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f620: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
f630: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f640: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
f650: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
f660: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
f670: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
f680: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f690: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
f6a0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
f6b0: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
f6c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f6d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f6e0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
f6f0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
f700: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
f710: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  no);.        pIn
f720: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f730: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
f740: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
f750: 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
f760: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f770: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
f780: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
f790: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
f7a0: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
f7b0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
f7c0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
f7d0: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
f7e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
f7f0: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
f800: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
f810: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
f820: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
f830: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
f840: 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73  nLock--;.    ass
f850: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
f860: 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
f870: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
f880: 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 ){.      close
f890: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
f8a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e  );.    }.  }..en
f8b0: 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  d_unlock:.  unix
f8c0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
f8d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f8e0: 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
f8f0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
f900: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f910: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
f920: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
f930: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
f940: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
f950: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
f960: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
f970: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
f980: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
f990: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
f9a0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
f9b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
f9c0: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
f9d0: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
f9e0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
f9f0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
fa00: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
fa10: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
fa20: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
fa30: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
fa40: 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51 4c  leLock){.#if SQL
fa50: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
fa60: 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65 46  E>0.  assert( eF
fa70: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
fa80: 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69  LOCK || ((unixFi
fa90: 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68  le *)id)->nFetch
faa0: 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out==0 );.#endif
fab0: 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
fac0: 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
fad0: 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20  ock, 0);.}..#if 
fae0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
faf0: 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
fb00: 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
fb10: 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
fb20: 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20   nByte);.static 
fb30: 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
fb40: 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
fb50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
fb60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
fb70: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
fb80: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
fb90: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
fba0: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
fbb0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
fbc0: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
fbd0: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
fbe0: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
fbf0: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
fc00: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
fc10: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
fc20: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
fc30: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
fc40: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
fc50: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
fc60: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
fc70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
fc80: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
fc90: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
fca0: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
fcb0: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
fcc0: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
fcd0: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
fce0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
fcf0: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
fd00: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
fd10: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
fd20: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fd30: 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53 51  File*)id;.#if SQ
fd40: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
fd50: 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70  ZE>0.  unixUnmap
fd60: 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e  file(pFile);.#en
fd70: 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
fd80: 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62  >h>=0 ){.    rob
fd90: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
fda0: 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e   pFile->h, __LIN
fdb0: 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  E__);.    pFile-
fdc0: 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66  >h = -1;.  }.#if
fdd0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
fde0: 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a  ( pFile->pId ){.
fdf0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63      if( pFile->c
fe00: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
fe10: 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  ILE_DELETE ){.  
fe20: 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69      osUnlink(pFi
fe30: 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  le->pId->zCanoni
fe40: 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  calName);.    }.
fe50: 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61      vxworksRelea
fe60: 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e  seFileId(pFile->
fe70: 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  pId);.    pFile-
fe80: 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  >pId = 0;.  }.#e
fe90: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
fea0: 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f  TE_UNLINK_AFTER_
feb0: 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69 6c  CLOSE.  if( pFil
fec0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
fed0: 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29  NIXFILE_DELETE )
fee0: 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70  {.    osUnlink(p
fef0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
ff00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
ff10: 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d 3e  (char**)&pFile->
ff20: 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c  zPath);.    pFil
ff30: 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20 20  e->zPath = 0;.  
ff40: 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
ff50: 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33  CE(("CLOSE   %-3
ff60: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
ff70: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
ff80: 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  -1);.  sqlite3_f
ff90: 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ree(pFile->pUnus
ffa0: 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  ed);.  memset(pF
ffb0: 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
ffc0: 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  nixFile));.  ret
ffd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ffe0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
fff0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
10000 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71  int unixClose(sq
10010 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
10020 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10030 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
10040 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10050 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65 72  File *)id;.  ver
10060 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29  ifyDbFile(pFile)
10070 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
10080 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75  d, NO_LOCK);.  u
10090 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
100a0 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
100b0 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
100c0 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
100d0 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
100e0 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
100f0 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
10100 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
10110 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
10120 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
10130 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
10140 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
10150 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
10160 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
10170 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69    if( ALWAYS(pFi
10180 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70  le->pInode) && p
10190 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
101a0 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
101b0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
101c0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
101d0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
101e0 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
101f0 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
10200 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
10210 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
10220 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
10230 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
10240 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
10250 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
10260 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
10270 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
10280 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68  losed .    ** wh
10290 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
102a0 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
102b0 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
102c0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
102d0 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
102e0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
102f0 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
10300 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
10310 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
10320 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
10330 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
10340 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
10350 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
10360 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
10440 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
10470 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
10480 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
10490 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
104a0 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
104b0 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
104c0 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
104d0 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
104e0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
104f0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
10500 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
10510 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
10520 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
10530 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
10540 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
10550 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
10560 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
10570 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
10580 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
10590 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
105a0 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
105b0 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
105c0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
105d0 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
105e0 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
105f0 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
10600 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
10610 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
10620 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
10630 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
10640 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
10650 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
10660 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
10670 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
10680 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
10690 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
106a0 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
106b0 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
106c0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
106d0 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
106e0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
106f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
10700 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
10710 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
10720 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
10730 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
10740 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
10750 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
10760 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
10770 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
10780 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
10790 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
107a0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
107b0 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
107c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
107d0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
107e0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
107f0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
10800 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
10810 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10820 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
10830 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
10840 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
10850 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
10860 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10870 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
10880 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
10890 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
108a0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
108b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
108c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
108d0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
108e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
108f0 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
10900 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  _file *id) {.  r
10910 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
10920 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  ile(id);.}../***
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f   End of the no-o
10950 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  p lock implement
10960 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a30 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74  ****** Begin dot
10a40 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  -file Locking **
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10a70 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c  ** The dotfile l
10a80 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
10a90 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65  ation uses the e
10aa0 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61  xistence of sepa
10ab0 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c  rate lock.** fil
10ac0 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72  es (really a dir
10ad0 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72  ectory) to contr
10ae0 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
10af0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
10b00 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73   works.** on jus
10b10 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69  t about every fi
10b20 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61  lesystem imagina
10b30 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20  ble.  But there 
10b40 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e  are serious down
10b50 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  sides:.**.**    
10b60 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65  (1)  There is ze
10b70 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20  ro concurrency. 
10b80 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72   A single reader
10b90 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65   blocks all othe
10ba0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e  r.**         con
10bb0 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65  nections from re
10bc0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
10bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
10be0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20  *.**    (2)  An 
10bf0 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73  application cras
10c00 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20  h or power loss 
10c10 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20  can leave stale 
10c20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20  lock files.**   
10c30 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72        sitting ar
10c40 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74  ound that need t
10c50 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e  o be cleared man
10c60 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76  ually..**.** Nev
10c70 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74  ertheless, a dot
10c80 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f  lock is an appro
10c90 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
10ca0 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e  ode for use if n
10cb0 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  o.** other locki
10cc0 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61  ng strategy is a
10cd0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
10ce0 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
10cf0 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e  works by creatin
10d00 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79  g a subdirectory
10d10 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
10d20 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
10d30 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
10d40 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
10d50 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
10d60 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
10d70 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
10d80 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tence of a lock 
10d90 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65  directory implie
10da0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
10db0 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a  ock.  All other.
10dc0 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53  ** lock types (S
10dd0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
10de0 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61   PENDING) are ma
10df0 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53  pped into EXCLUS
10e00 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IVE..*/../*.** T
10e10 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61  he file suffix a
10e20 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  dded to the data
10e30 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69   base filename i
10e40 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
10e50 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69  e the.** lock di
10e60 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66  rectory..*/.#def
10e70 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
10e80 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
10e90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
10ea0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
10eb0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
10ec0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
10ed0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
10ee0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
10ef0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
10f00 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
10f10 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
10f20 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
10f30 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
10f40 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
10f50 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
10f60 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
10f70 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
10f80 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
10f90 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
10fa0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
10fb0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
10fc0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
10fd0 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
10fe0 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
10ff0 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
11000 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
11010 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
11020 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
11030 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
11040 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
11050 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
11060 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
11070 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
11080 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
11090 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
110a0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
110b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
110c0 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
110d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
110e0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
110f0 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
11100 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11110 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
11120 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11140 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
11150 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
11160 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11170 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63   reserved = osAc
11180 63 65 73 73 28 28 63 6f 6e 73 74 20 63 68 61 72  cess((const char
11190 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
111a0 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30 3b 0a  Context, 0)==0;.
111b0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
111c0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
111d0 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
111e0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
111f0 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65  served));.  *pRe
11200 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
11210 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11220 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
11230 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
11240 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
11250 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
11260 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
11270 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
11280 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
11290 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
112a0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
112b0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
112c0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
112d0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
112e0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
112f0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
11300 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
11310 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
11320 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
11330 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
11340 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
11350 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
11360 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
11370 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
11380 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
11390 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
113a0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
113b0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
113c0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
113d0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
113e0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
113f0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
11400 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
11410 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
11420 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
11430 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
11440 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
11450 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
11460 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
11470 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
11480 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
11490 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
114a0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
114b0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
114c0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
114d0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
114e0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
114f0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
11500 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
11510 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
11520 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
11530 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
11540 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74  ..**.** With dot
11550 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65  file locking, we
11560 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70   really only sup
11570 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20  port state (4): 
11580 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75  EXCLUSIVE..** Bu
11590 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f  t we track the o
115a0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  ther locking lev
115b0 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  els internally..
115c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
115d0 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  tlockLock(sqlite
115e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
115f0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
11600 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11610 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11620 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
11630 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c  e = (char *)pFil
11640 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
11650 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
11660 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20  LITE_OK;...  /* 
11670 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c  If we have any l
11680 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  ock, then the lo
11690 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20  ck file already 
116a0 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20  exists.  All we 
116b0 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  have.  ** to do 
116c0 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e  is adjust our in
116d0 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
116e0 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e   the lock level.
116f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
11700 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
11710 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  O_LOCK ){.    pF
11720 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11730 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
11740 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65  /* Always update
11750 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f   the timestamp o
11760 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a  n the old file *
11770 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54  /.#ifdef HAVE_UT
11780 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c  IME.    utime(zL
11790 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
117a0 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73  #else.    utimes
117b0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
117c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
117d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
117e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
117f0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
11800 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d  ck */.  rc = osM
11810 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  kdir(zLockFile, 
11820 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c  0777);.  if( rc<
11830 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c  0 ){.    /* fail
11840 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ed to open/creat
11850 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63  e the lock direc
11860 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tory */.    int 
11870 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11880 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d      if( EEXIST =
11890 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
118a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
118b0 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SY;.    } else {
118c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
118d0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
118e0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
118f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
11900 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11910 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
11920 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11930 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
11940 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
11950 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
11960 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  c;.  } .  .  /* 
11970 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
11980 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
11990 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
119a0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
119b0 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
119c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
119d0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
119e0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
119f0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
11a00 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
11a10 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
11a20 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
11a30 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
11a40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
11a50 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
11a60 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
11a70 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
11a80 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
11a90 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
11aa0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
11ab0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
11ac0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
11ad0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
11ae0 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
11af0 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
11b00 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
11b10 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
11b20 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11b30 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
11b40 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
11b50 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11b60 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
11b70 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
11b80 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
11b90 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
11ba0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
11bb0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11bc0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
11bd0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11be0 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
11bf0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
11c00 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
11c10 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
11c20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
11c30 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
11c40 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
11c50 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
11c60 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
11c70 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11c80 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
11c90 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
11ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11cb0 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
11cc0 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
11cd0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
11ce0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
11cf0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
11d00 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
11d10 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
11d20 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
11d30 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
11d40 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
11d50 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
11d60 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
11d70 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
11d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11d90 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
11da0 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
11db0 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
11dc0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
11dd0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
11de0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
11df0 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28  .  rc = osRmdir(
11e00 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
11e10 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e  ( rc<0 ){.    in
11e20 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
11e30 3b 0a 20 20 20 20 69 66 28 20 74 45 72 72 6e 6f  ;.    if( tErrno
11e40 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  ==ENOENT ){.    
11e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11e70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
11e80 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
11e90 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
11ea0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
11eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
11ec0 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
11ed0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11ee0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
11ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11f00 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
11f10 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ile.  Make sure 
11f20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
11f30 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72  n released befor
11f40 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e closing..*/.st
11f50 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
11f60 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
11f70 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78  le *id) {.  unix
11f80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11f90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
11fa0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
11fb0 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
11fc0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
11fd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
11fe0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11ff0 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c  xt);.  return cl
12000 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
12010 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
12020 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
12030 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20  e dot-file lock 
12040 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
12050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12060 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120b0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
120c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12100 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
12110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
12120 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69  egin flock Locki
12130 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
12140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12150 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ***.**.** Use th
12160 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d  e flock() system
12170 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65   call to do file
12180 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   locking..**.** 
12190 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
121a0 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65  is like dot-file
121b0 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74   locking in that
121c0 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
121d0 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69  fine-grain locki
121e0 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72  ng levels suppor
121f0 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72  ted by SQLite ar
12200 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f  e collapsed into
12210 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63  .** a single exc
12220 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e  lusive lock.  In
12230 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48   other words, SH
12240 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
12250 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c  and.** PENDING l
12260 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d  ocks are the sam
12270 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58  e thing as an EX
12280 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53  CLUSIVE lock.  S
12290 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77  QLite.** still w
122a0 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f  orks when you do
122b0 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75   this, but concu
122c0 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65  rrency is reduce
122d0 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20  d since.** only 
122e0 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
122f0 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20   can be reading 
12300 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
12310 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d  a time..**.** Om
12320 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20  it this section 
12330 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
12340 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69  _LOCKING_STYLE i
12350 73 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  s turned off.*/.
12360 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
12370 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
12380 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f  ./*.** Retry flo
12390 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  ck() calls that 
123a0 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a  fail with EINTR.
123b0 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a  */.#ifdef EINTR.
123c0 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
123d0 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20  t_flock(int fd, 
123e0 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72  int op){.  int r
123f0 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c  c;.  do{ rc = fl
12400 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69  ock(fd,op); }whi
12410 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
12420 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
12430 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
12440 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74  .# define robust
12450 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63  _flock(a,b) floc
12460 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20  k(a,b).#endif.  
12470 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
12480 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
12490 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
124a0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
124b0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
124c0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
124d0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
124e0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
124f0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
12500 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
12510 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
12520 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
12530 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
12540 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
12550 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
12560 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
12570 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
12580 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
12590 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
125a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
125b0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
125c0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
125d0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
125e0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
125f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12600 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
12610 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12620 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12630 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65  d;.  .  Simulate
12640 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
12650 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12660 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
12670 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
12680 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a  pFile );.  .  /*
12690 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
126a0 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
126b0 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
126c0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
126d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
126e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
126f0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12700 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
12710 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
12720 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
12730 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
12740 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
12750 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
12760 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
12770 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
12780 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
12790 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
127a0 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
127b0 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20  f( !lrc ){.     
127c0 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b   /* got the lock
127d0 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20  , unlock it */. 
127e0 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73       lrc = robus
127f0 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
12800 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20  , LOCK_UN);.    
12810 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20    if ( lrc ) {. 
12820 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
12830 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12840 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69     /* unlock fai
12850 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  led with an erro
12860 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63  r */.        lrc
12870 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
12880 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20  UNLOCK; .       
12890 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
128a0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
128b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
128c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
128d0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
128e0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
128f0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
12900 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
12910 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
12920 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
12930 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
12940 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
12950 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
12960 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
12970 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
12980 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12990 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
129a0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
129b0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
129c0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
129d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
129e0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
129f0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12a00 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
12a10 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
12a20 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
12a30 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
12a40 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12a50 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
12a60 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
12a70 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
12a80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12a90 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
12aa0 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
12ab0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
12ac0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12ad0 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
12ae0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
12af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12b00 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
12b10 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
12b20 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
12b30 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
12b40 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
12b50 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
12b60 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
12b70 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
12b80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
12b90 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
12ba0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
12bb0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
12bc0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
12bd0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
12be0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
12bf0 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
12c00 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
12c10 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
12c20 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
12c30 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
12c40 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
12c50 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
12c60 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
12c70 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
12c80 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
12c90 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
12ca0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
12cb0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
12cc0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
12cd0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
12ce0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
12cf0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
12d00 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
12d10 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
12d20 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
12d30 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
12d40 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
12d50 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
12d60 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
12d70 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
12d80 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12d90 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
12da0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
12db0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
12dc0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
12dd0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
12de0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
12df0 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
12e00 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
12e10 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
12e20 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
12e30 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
12e40 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
12e50 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
12e60 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
12e70 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
12e80 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
12e90 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
12ea0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
12eb0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
12ec0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
12ed0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
12ee0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
12ef0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
12f00 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
12f10 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
12f20 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12f30 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12f40 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
12f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
12f60 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12f70 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
12f80 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12f90 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
12fa0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
12fb0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
12fc0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
12fd0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
12fe0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
12ff0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
13000 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
13010 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
13020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13030 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
13040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13050 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13060 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
13070 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
13080 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f (robust_flock(
13090 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
130a0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
130b0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
130c0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
130d0 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
130e0 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
130f0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
13100 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
13110 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
13120 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
13130 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
13140 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  rc) ){.      sto
13150 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
13160 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
13170 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
13180 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
13190 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
131a0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46  urn ok */.    pF
131b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
131c0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
131d0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
131e0 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c      %d %s %s (fl
131f0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
13200 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
13210 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
13220 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
13230 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
13240 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20  iled"));.#ifdef 
13250 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13260 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
13270 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
13280 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
13290 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
132a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
132b0 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  Y;.  }.#endif /*
132c0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
132d0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
132e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
132f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
13300 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
13310 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
13320 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
13330 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
13340 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
13350 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
13360 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
13370 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
13380 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
13390 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
133a0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
133b0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
133c0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
133d0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
133e0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
133f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13400 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
13410 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13420 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
13430 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
13440 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
13450 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
13460 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
13470 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
13480 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
13490 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
134a0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
134b0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
134c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
134d0 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
134e0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
134f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
13500 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
13510 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
13520 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
13530 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
13540 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13550 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
13560 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
13570 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
13580 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
13590 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
135a0 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
135b0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
135c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
135d0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
135e0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
135f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13600 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
13610 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
13620 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f( robust_flock(
13630 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
13640 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  N) ){.#ifdef SQL
13650 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13660 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
13670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13680 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  K;.#endif /* SQL
13690 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
136a0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
136b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
136c0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
136d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
136e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
136f0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
13700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13710 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
13720 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
13730 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
13740 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13750 2a 69 64 29 20 7b 0a 20 20 61 73 73 65 72 74 28  *id) {.  assert(
13760 20 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c 6f 63   id!=0 );.  floc
13770 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13780 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  OCK);.  return c
13790 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
137a0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
137b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
137c0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
137d0 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a  S_VXWORK */../**
137e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137f0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f  * End of the flo
13800 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ck lock implemen
13810 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
13880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
138d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138e0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d  ****** Begin Nam
138f0 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63  ed Semaphore Loc
13900 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
13910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13920 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
13930 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
13940 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
13950 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20   VxWorks..**.** 
13960 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  Semaphore lockin
13970 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f  g is like dot-lo
13980 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20  ck and flock in 
13990 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f  that it really o
139a0 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  nly.** supports 
139b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e  EXCLUSIVE lockin
139c0 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  g.  Only a singl
139d0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65  e process can re
139e0 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74  ad or write.** t
139f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a00 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
13a10 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74  s reduces potent
13a20 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c  ial concurrency,
13a30 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   but.** makes th
13a40 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
13a50 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65  ation much easie
13a60 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  r..*/.#if OS_VXW
13a70 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
13a80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
13a90 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
13aa0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
13ab0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
13ac0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
13ad0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
13ae0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
13af0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
13b00 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
13b10 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
13b20 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
13b30 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
13b40 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
13b50 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
13b60 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
13b70 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
13b80 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
13b90 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
13ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13bb0 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64  emXCheckReserved
13bc0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13bd0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
13be0 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
13bf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13c00 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
13c10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13c20 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13c30 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
13c40 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
13c50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
13c60 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
13c70 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
13c80 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
13c90 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
13ca0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
13cb0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
13cc0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
13cd0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
13ce0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13cf0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
13d00 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
13d10 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
13d20 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
13d30 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
13d40 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
13d50 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
13d60 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
13d70 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d  em;..    if( sem
13d80 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
13d90 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  -1 ){.      int 
13da0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
13db0 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e        if( EAGAIN
13dc0 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   != tErrno ){.  
13dd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13de0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
13df0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
13e00 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
13e10 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20  ESERVEDLOCK);.  
13e20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
13e30 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
13e40 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  no);.      } els
13e50 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  e {.        /* s
13e60 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20  omeone else has 
13e70 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65  the lock when we
13e80 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20   are in NO_LOCK 
13e90 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72  */.        reser
13ea0 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46  ved = (pFile->eF
13eb0 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44  ileLock < SHARED
13ec0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
13ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ee0 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76   /* we could hav
13ef0 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
13f00 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f  it */.      sem_
13f10 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20  post(pSem);.    
13f20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
13f30 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
13f40 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22  d %d %d (sem)\n"
13f50 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
13f60 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
13f70 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
13f80 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
13f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
13fa0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
13fb0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
13fc0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
13fd0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
13fe0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13ff0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14000 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14010 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14020 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14030 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14040 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14050 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14060 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
14070 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
14080 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
14090 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
140a0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
140b0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
140c0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
140d0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
140e0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
140f0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14100 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14110 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14120 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14130 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14140 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14150 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14160 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
14170 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
14180 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
14190 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
141a0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
141b0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
141c0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
141d0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
141e0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
141f0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14200 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14210 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14220 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14230 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14240 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d  LUSIVE.**.** Sem
14250 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c  aphore locks onl
14260 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
14270 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
14280 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
14290 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
142a0 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
142b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
142c0 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
142d0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
142e0 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
142f0 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
14300 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
14310 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
14320 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
14330 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
14340 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
14350 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
14360 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
14370 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
14380 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
14390 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
143a0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
143b0 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f 63 6b  tic int semXLock
143c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
143d0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
143e0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
143f0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14400 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
14410 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
14420 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e  node->pSem;.  in
14430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14440 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
14450 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
14460 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
14470 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
14480 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
14490 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
144a0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
144b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
144c0 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
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 20 20   = eFileLock;.  
144f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14500 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
14510 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
14520 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68    /* lock semaph
14530 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c  ore now but bail
14540 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64   out when alread
14550 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69  y locked. */.  i
14560 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
14570 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
14580 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14590 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
145a0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
145b0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
145c0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
145d0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
145e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
145f0 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65  ileLock;.. sem_e
14600 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
14610 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
14620 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
14630 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
14640 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
14650 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
14660 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
14670 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
14680 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
14690 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
146a0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
146b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
146c0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
146d0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
146e0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
146f0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
14700 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14710 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
14720 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 73 71  nt semXUnlock(sq
14730 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14740 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
14750 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14760 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14770 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  id;.  sem_t *pSe
14780 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
14790 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  e->pSem;..  asse
147a0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
147b0 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
147c0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
147d0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
147e0 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
147f0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
14800 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
14810 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14820 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
14830 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
14840 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
14850 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
14860 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
14870 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14880 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
14890 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
148a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
148b0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
148c0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
148d0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
148e0 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
148f0 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
14900 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
14910 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
14920 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14930 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
14940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14950 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
14960 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
14970 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
14980 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
14990 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
149a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
149b0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
149c0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
149d0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
149e0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
149f0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
14a00 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
14a10 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
14a20 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
14a30 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
14a40 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
14a50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
14a60 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
14a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14a80 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
14a90 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
14aa0 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71 6c 69  t semXClose(sqli
14ab0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
14ac0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
14ad0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14ae0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14af0 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 28  .    semXUnlock(
14b00 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
14b10 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
14b20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
14b30 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
14b40 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
14b50 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
14b60 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
14b70 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
14b80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14b90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
14ba0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
14bb0 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
14bc0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
14bd0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
14be0 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
14bf0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
14c00 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
14c10 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
14c20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
14c30 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
14c40 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
14c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c90 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
14ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ce0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d00 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
14d10 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
14d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d30 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
14d40 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
14d50 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
14d60 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
14d70 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
14d80 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
14d90 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
14da0 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
14db0 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
14dc0 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
14dd0 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
14de0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
14df0 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
14e00 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
14e10 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
14e20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
14e30 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
14e40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
14e50 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
14e60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
14e70 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
14e80 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
14e90 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
14ea0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
14eb0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14ec0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14ed0 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
14ee0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
14ef0 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
14f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
14f10 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
14f20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14f30 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
14f40 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
14f50 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
14f60 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14f70 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
14f80 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
14f90 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
14fa0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
14fb0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
14fc0 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
14fd0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
14fe0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
14ff0 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
15000 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
15010 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
15020 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
15030 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15040 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
15050 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
15060 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
15070 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
15080 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
15090 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
150a0 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
150b0 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
150c0 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
150f0 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
15100 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
15110 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
15120 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
15130 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
15140 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
15150 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
15160 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
15170 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
15180 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
15190 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
151a0 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
151b0 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
151c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
151d0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
151e0 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
151f0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
15200 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
15210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
15220 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
15230 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
15240 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
15250 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
15260 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15270 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15280 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
15290 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
152a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
152b0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
152c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
152d0 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
152e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
152f0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
15300 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15310 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
15320 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
15330 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
15340 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
15350 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
15360 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
15370 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
15380 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
15390 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
153a0 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
153b0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
153c0 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
153d0 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
153e0 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
153f0 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
15400 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
15410 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
15420 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
15430 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
15440 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
15450 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
15460 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
15470 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
15480 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
15490 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
154a0 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
154b0 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
154c0 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
154d0 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
154e0 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
154f0 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
15500 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
15510 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
15520 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
15530 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15540 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
15550 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
15560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
15570 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
15580 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
15590 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
155a0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
155b0 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
155c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
155d0 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
155e0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
155f0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
15620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
15630 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
15640 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
15650 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
15660 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
15670 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
15680 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
15690 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
156a0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
156b0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
156c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
156d0 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
156e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
156f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15700 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15710 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15720 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15730 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15740 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15750 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15760 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15770 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
15780 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
15790 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
157a0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
157b0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
157c0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
157d0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
157e0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
157f0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15800 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15810 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15820 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
15830 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
15840 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15850 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
15860 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15870 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
15880 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
15890 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
158a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
158b0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
158c0 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a  xt *context;.  .
158d0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
158e0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
158f0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
15900 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
15910 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15920 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  );.  context = (
15930 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
15940 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
15950 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
15960 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
15970 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
15980 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
15990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
159a0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
159b0 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
159c0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
159d0 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
159e0 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20   threads */.  . 
159f0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
15a00 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
15a10 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
15a20 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
15a30 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
15a40 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
15a50 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
15a60 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
15a70 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
15a80 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
15a90 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
15aa0 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28   it..   */.  if(
15ab0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
15ac0 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45    /* lock the RE
15ad0 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20  SERVED byte */. 
15ae0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70     int lrc = afp
15af0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15b00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15b10 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
15b20 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53  ,1);  .    if( S
15b30 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b  QLITE_OK==lrc ){
15b40 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
15b50 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
15b60 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
15b70 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
15b80 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
15b90 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
15ba0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
15bb0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
15bc0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15bd0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
15be0 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
15bf0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
15c00 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
15c10 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
15c20 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
15c30 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
15c40 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72  t */.      reser
15c50 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
15c60 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
15c70 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
15c80 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d     rc=lrc;.    }
15c90 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
15ca0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
15cb0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
15cc0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61  LOCK %d %d %d (a
15cd0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15ce0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
15cf0 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20  ;.  .  *pResOut 
15d00 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
15d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15d20 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
15d30 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
15d40 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
15d50 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
15d60 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
15d70 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
15d80 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
15d90 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
15da0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
15db0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
15dc0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
15dd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
15de0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
15df0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
15e00 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
15e10 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
15e20 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
15e30 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
15e40 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
15e50 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
15e60 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
15e70 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
15e80 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
15e90 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
15ea0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
15eb0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
15ec0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
15ed0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
15ee0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
15ef0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
15f00 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
15f10 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
15f20 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
15f30 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
15f40 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
15f50 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
15f60 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
15f70 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
15f80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
15f90 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
15fa0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
15fb0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
15fc0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
15fd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15fe0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
15ff0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
16000 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
16010 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
16020 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
16030 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
16040 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f  static int afpLo
16050 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16060 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
16070 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
16080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
16090 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
160a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
160b0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
160c0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
160d0 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
160e0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
160f0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
16100 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
16110 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
16120 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
16130 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
16140 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
16150 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
16160 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
16170 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
16180 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
16190 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
161a0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
161b0 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
161c0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
161d0 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
161e0 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
161f0 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70 69 64  hared , osGetpid
16200 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (0)));..  /* If 
16210 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
16220 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
16230 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
16240 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
16250 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
16260 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
16270 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
16280 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
16290 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
162a0 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
162b0 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
162c0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
162d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
162e0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
162f0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
16300 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
16310 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
16320 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
16330 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
16340 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
16350 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
16370 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
16380 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
16390 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
163a0 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
163b0 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
163c0 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
163d0 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
163e0 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
163f0 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
16400 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
16410 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
16420 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
16430 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
16440 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
16450 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
16460 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
16470 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
16480 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
16490 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
164a0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
164b0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
164c0 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
164d0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
164e0 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
164f0 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
16500 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
16510 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
16520 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
16530 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
16540 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
16550 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
16560 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
16570 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16580 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
16590 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
165a0 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
165b0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
165c0 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
165d0 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
165e0 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
165f0 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
16600 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
16610 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
16620 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
16630 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
16640 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16650 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
16660 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
16670 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
16680 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
16690 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
166a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
166b0 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
166c0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
166d0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
166e0 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
166f0 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
16700 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
16710 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
16720 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
16730 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
16740 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
16750 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
16760 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
16770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
16780 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
16790 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
167a0 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
167b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
167c0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
167d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
167e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
167f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
16800 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16810 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
16820 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
16830 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
16840 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
16850 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
16860 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16870 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
16880 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
16890 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
168a0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
168b0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
168c0 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
168d0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
168e0 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
168f0 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
16900 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
16910 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
16920 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
16930 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
16940 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
16950 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
16960 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
16970 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
16980 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16990 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
169a0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
169b0 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
169c0 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
169d0 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
169e0 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
169f0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16a00 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16a10 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16a20 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
16a30 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
16a40 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
16a50 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
16a60 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16a70 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
16a80 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
16a90 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
16aa0 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
16ab0 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
16ac0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
16ad0 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
16ae0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
16af0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
16b00 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16b10 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
16b20 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
16b30 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  1Errno = 0;.    
16b40 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
16b50 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
16b60 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
16b70 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16b80 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
16b90 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
16ba0 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
16bb0 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
16bc0 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
16bd0 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
16be0 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
16bf0 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
16c00 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
16c10 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
16c20 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
16c30 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
16c40 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
16c50 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
16c60 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
16c70 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
16c80 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
16c90 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
16ca0 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
16cb0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16cc0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
16cd0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
16ce0 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
16cf0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
16d00 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16d10 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
16d20 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
16d30 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
16d40 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
16d50 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
16d60 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
16d70 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
16d80 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16d90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16da0 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
16db0 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
16dc0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
16dd0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
16de0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
16df0 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72 72  o(pFile, lrc1Err
16e00 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
16e10 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc1;.      goto
16e20 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16e30 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53     } else if( IS
16e40 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32  _LOCK_ERROR(lrc2
16e50 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
16e60 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc2;.      goto
16e70 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16e80 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72     } else if( lr
16e90 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  c1 != SQLITE_OK 
16ea0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  ) {.      rc = l
16eb0 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rc1;.    } else 
16ec0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
16ed0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
16ee0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
16ef0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
16f00 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
16f10 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
16f20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
16f30 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16f40 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
16f50 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
16f60 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
16f70 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
16f80 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
16f90 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
16fa0 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65  his.     ** same
16fb0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
16fc0 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
16fd0 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
16fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16ff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
17000 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
17010 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
17020 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
17030 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
17040 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
17050 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
17060 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
17070 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
17080 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
17090 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
170a0 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
170b0 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
170c0 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ileLock );.    i
170d0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20  f (eFileLock >= 
170e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
170f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17100 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  k < RESERVED_LOC
17110 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
17120 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
17130 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
17140 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
17150 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17160 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
17170 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
17180 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66  1);.      if( !f
17190 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
171a0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
171b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
171c0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
171d0 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f  ailed && eFileLo
171e0 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f  ck == EXCLUSIVE_
171f0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a  LOCK) {.      /*
17200 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
17210 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20  USIVE lock */.  
17220 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
17230 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65  Remove the share
17240 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72  d lock before tr
17250 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20  ying the range. 
17260 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a   we'll need to .
17270 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62        ** reestab
17280 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
17290 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74  lock if we can't
172a0 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c   get the  afpUnl
172b0 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ock.      */.   
172c0 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20     if( !(failed 
172d0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
172e0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
172f0 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
17300 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  T +.            
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
17320 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
17330 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20   1, 0)) ){.     
17340 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d     int failed2 =
17350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17360 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
17370 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
17380 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
17390 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
173a0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
173b0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
173c0 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
173d0 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20  D_FIRST, .      
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17400 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20  SIZE, 1);.      
17410 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20    if( failed && 
17420 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65  (failed2 = afpSe
17430 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17440 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
17470 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61  ST + pInode->sha
17480 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
17490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
174a0 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
174b0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
174c0 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
174d0 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
174e0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
174f0 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
17500 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
17510 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
17520 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49  ailed & SQLITE_I
17530 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
17540 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
17550 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
17560 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
17570 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
17580 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17590 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
175a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
175b0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
175c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
175d0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
175e0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
175f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
17600 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
17620 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
17630 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
17640 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
17650 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
17660 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
17670 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
17680 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
17690 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
176a0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
176b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
176c0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
176d0 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f  .  }.  .afp_end_
176e0 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
176f0 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
17700 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
17710 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c   %s %s (afp)\n",
17720 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
17730 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
17740 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
17750 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
17760 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
17770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17780 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
17790 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
177a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
177b0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
177c0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
177d0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
177e0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
177f0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
17800 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
17810 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
17820 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
17830 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
17840 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
17850 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
17860 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
17870 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
17880 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f  atic int afpUnlo
17890 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
178a0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
178b0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
178c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
178d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
178e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
178f0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
17900 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
17910 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
17920 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
17930 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
17940 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
17950 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68  xt;.  int skipSh
17960 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66  ared = 0;.#ifdef
17970 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
17980 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  nt h = pFile->h;
17990 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
179a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
179b0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
179c0 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
179d0 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
179e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
179f0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
17a00 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
17a10 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
17a20 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
17a30 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17a40 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20  nShared,.       
17a50 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
17a60 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
17a70 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
17a80 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
17a90 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
17aa0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
17ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17ac0 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
17ad0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
17ae0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
17af0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
17b00 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
17b10 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
17b20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
17b30 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
17b40 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
17b50 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
17b60 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
17b70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17b80 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
17b90 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17ba0 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
17bb0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17bc0 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66  ign(0);.    .#if
17bd0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17be0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
17bf0 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
17c00 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
17c10 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
17c20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
17c30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17c40 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
17c50 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
17c60 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
17c70 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
17c80 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
17c90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
17ca0 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
17cb0 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
17cc0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
17cd0 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
17ce0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
17cf0 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
17d00 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
17d10 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
17d20 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
17d30 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
17d40 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
17d50 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
17d60 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
17d70 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
17d80 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
17d90 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
17da0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
17db0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
17dc0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
17dd0 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
17de0 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
17df0 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
17e00 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
17e10 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
17e20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
17e30 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
17e40 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
17e50 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17e60 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
17e70 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
17e80 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17e90 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17ea0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17eb0 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
17ec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
17ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17ee0 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
17ef0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
17f00 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
17f10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
17f20 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
17f30 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
17f40 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
17f50 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
17f60 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
17f70 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17f80 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
17f90 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
17fa0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17fb0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
17fc0 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
17fd0 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
17fe0 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
17ff0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
18000 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18020 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
18030 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
18040 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
18050 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18060 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18070 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
18080 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
18090 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
180a0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
180b0 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
180c0 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
180d0 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
180e0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
180f0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
18100 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
18110 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
18120 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
18130 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
18140 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
18150 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
18160 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18170 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
18180 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18190 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
181a0 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
181b0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
181c0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
181d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
181e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
181f0 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
18200 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
18210 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
18220 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
18230 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
18240 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
18250 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
18260 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
18270 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
18280 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
18290 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
182a0 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
182b0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
182c0 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
182d0 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
182e0 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
182f0 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
18300 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
18310 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
18320 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
18330 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18340 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
18350 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18360 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
18370 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18380 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
18390 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
183a0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
183b0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
183c0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
183d0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
183e0 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
183f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18400 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
18410 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
18420 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
18430 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
18440 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
18450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
18480 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
18490 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
184a0 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
184b0 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
184c0 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
184d0 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
184e0 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
184f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18500 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
18510 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
18520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
18530 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18540 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
18550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18560 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
18570 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
18580 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
18590 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
185a0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
185b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
185c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
185d0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
185e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
185f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
18600 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
18610 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
18620 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
18630 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  erMutex();.  if(
18640 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
18650 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
18660 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
18670 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
18680 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
18690 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
186a0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
186b0 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
186c0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
186d0 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
186e0 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
186f0 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
18700 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
18710 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69  o pInode->aPendi
18720 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
18730 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
18740 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  osed when.    **
18750 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
18760 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
18770 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
18780 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
18790 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
187a0 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69  o(pFile);.  sqli
187b0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
187c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
187d0 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
187e0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
187f0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
18800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18810 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
18820 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
18830 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
18840 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
18850 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
18860 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
18870 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
18880 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
18890 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
188a0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
188b0 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
188c0 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
188d0 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
188e0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
188f0 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
18900 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
18910 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
18920 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
18930 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
18940 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18950 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
18960 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
18970 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18990 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
189a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189e0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
189f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a30 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
18a50 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
18a60 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
18a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a80 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
18a90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
18aa0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
18ab0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
18ac0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
18ad0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
18ae0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
18af0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
18b00 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20    eFileLock. ** 
18b10 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
18b20 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
18b30 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
18b40 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
18b50 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
18b60 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
18b70 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
18b80 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
18b90 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
18ba0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
18bb0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
18bc0 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
18bd0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
18be0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
18bf0 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
18c00 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
18c10 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d  eFileLock, 1);.}
18c20 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
18c30 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
18c40 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
18c50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
18c60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
18c70 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53  above is the NFS
18c80 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
18c90 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
18ca0 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
18cb0 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
18cc0 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
18cd0 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
18ce0 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
18cf0 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
18d00 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  ble.  .**.******
18d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
18d20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c  End of the NFS l
18d30 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
18d40 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
18d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18da0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
18db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
18e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
18e10 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
18e20 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
18e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
18e50 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
18e60 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
18e70 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
18e80 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
18e90 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
18ea0 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
18eb0 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
18ec0 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
18ed0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
18ee0 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
18ef0 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
18f00 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
18f10 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
18f20 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
18f30 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
18f40 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
18f50 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
18f60 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
18f70 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
18f80 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
18f90 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
18fa0 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
18fb0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
18fc0 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
18fd0 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
18fe0 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
18ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19000 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
19010 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
19020 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
19030 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
19040 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
19050 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
19060 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
19070 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
19080 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
19090 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
190a0 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
190b0 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
190c0 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
190d0 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
190e0 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79 20   in any form by 
190f0 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
19100 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
19110 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
19120 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
19130 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
19140 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
19150 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
19160 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
19170 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
19180 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
19190 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
191a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
191b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
191c0 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
191d0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
191e0 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
191f0 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
19200 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
19210 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23  int prior = 0;.#
19220 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
19230 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
19240 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
19250 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
19260 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
19270 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72  R_START;.  asser
19280 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31  t( cnt==(cnt&0x1
19290 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
192a0 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20  t( id->h>2 );.  
192b0 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
192c0 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
192d0 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
192e0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
192f0 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
19300 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
19310 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
19320 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19330 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
19340 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
19350 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
19360 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19370 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
19380 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
19390 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
193a0 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
193b0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
193c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
193d0 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20 29 3b  ewOffset = -1 );
193e0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
193f0 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 74  et<0 ){.      st
19400 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
19410 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
19420 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
19430 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
19440 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e  ot = osRead(id->
19450 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
19460 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f  endif.    if( go
19470 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  t==cnt ) break;.
19480 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b      if( got<0 ){
19490 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
194a0 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d  ==EINTR ){ got =
194b0 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a   1; continue; }.
194c0 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b        prior = 0;
194d0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
194e0 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
194f0 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20  )id,  errno);.  
19500 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19510 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29  else if( got>0 )
19520 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67  {.      cnt -= g
19530 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ot;.      offset
19540 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
19550 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  rior += got;.   
19560 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
19570 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70  )(got + (char*)p
19580 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Buf);.    }.  }w
19590 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20  hile( got>0 );. 
195a0 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
195b0 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
195c0 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
195d0 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llu\n",.        
195e0 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70      id->h, got+p
195f0 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69  rior, offset-pri
19600 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  or, TIMER_ELAPSE
19610 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
19620 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  t+prior;.}../*.*
19630 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
19640 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
19650 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
19660 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
19670 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
19680 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
19690 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
196a0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
196b0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
196c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
196d0 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
196e0 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
196f0 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
19700 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
19710 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
19720 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
19730 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
19740 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
19750 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
19760 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
19770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
19780 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
19790 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
197a0 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
197b0 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
197c0 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
197d0 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
197e0 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
197f0 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
19800 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
19810 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
19820 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
19830 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
19840 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
19850 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
19860 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
19870 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
19880 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
19890 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
198a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
198b0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
198c0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
198d0 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
198e0 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
198f0 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
19900 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
19910 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
19920 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
19930 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
19940 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
19950 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
19960 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19970 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
19980 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
19990 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
199a0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
199b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
199c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
199d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
199e0 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d  nCopy = pFile->m
199f0 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
19a00 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
19a10 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
19a20 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
19a30 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
19a40 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
19a50 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
19a60 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
19a70 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
19a80 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
19a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19aa0 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
19ab0 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
19ac0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
19ad0 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
19ae0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
19af0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
19b00 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
19b10 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
19b20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
19b30 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
19b40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
19b50 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
19b60 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
19b70 70 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20  pFile, 0);   /* 
19b80 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
19b90 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
19ba0 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
19bb0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
19bc0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
19bd0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
19be0 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
19bf0 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
19c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19c10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
19c20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
19c30 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65  empt to seek the
19c40 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
19c50 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
19c60 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
19c70 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66  .** absolute off
19c80 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61  set iOff, then a
19c90 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
19ca0 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61  nBuf bytes of da
19cb0 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20  ta from.** pBuf 
19cc0 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  to it. If an err
19cd0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
19ce0 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69  n -1 and set *pi
19cf0 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  Errno. Otherwise
19d00 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  , .** return the
19d10 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f   actual number o
19d20 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
19d30 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65  (which may be le
19d40 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29  ss than.** nBuf)
19d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19d60 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a  seekAndWriteFd(.
19d70 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20    int fd,       
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
19da0 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ptor to write to
19db0 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20   */.  i64 iOff, 
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66        /* File of
19de0 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72  fset to begin wr
19df0 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f  iting at */.  co
19e00 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e20 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
19e30 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74  this buffer to t
19e40 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
19e50 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20   nBuf,          
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e70 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
19e80 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Buf in bytes */.
19e90 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20    int *piErrno  
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
19ec0 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20  number if error 
19ed0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
19ee0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f00 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
19f10 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   by system call 
19f20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42  */..  assert( nB
19f30 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66  uf==(nBuf&0x1fff
19f40 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
19f50 66 64 3e 32 20 29 3b 0a 20 20 61 73 73 65 72 74  fd>2 );.  assert
19f60 28 20 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a  ( piErrno!=0 );.
19f70 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66    nBuf &= 0x1fff
19f80 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  f;.  TIMER_START
19f90 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  ;..#if defined(U
19fa0 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20  SE_PREAD).  do{ 
19fb0 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69  rc = (int)osPwri
19fc0 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
19fd0 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65  f, iOff); }while
19fe0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
19ff0 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20  =EINTR );.#elif 
1a000 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1a010 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20  D64).  do{ rc = 
1a020 28 69 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28  (int)osPwrite64(
1a030 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20  fd, pBuf, nBuf, 
1a040 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63  iOff);}while( rc
1a050 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1a060 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b  TR);.#else.  do{
1a070 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d  .    i64 iSeek =
1a080 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c   lseek(fd, iOff,
1a090 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
1a0a0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1a0b0 20 69 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20   iSeek = -1 );. 
1a0c0 20 20 20 69 66 28 20 69 53 65 65 6b 3c 30 20 29     if( iSeek<0 )
1a0d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
1a0e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a0f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 57    }.    rc = osW
1a100 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e  rite(fd, pBuf, n
1a110 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Buf);.  }while( 
1a120 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1a130 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  INTR );.#endif..
1a140 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
1a150 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20  STRACE(("WRITE  
1a160 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
1a170 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c  %llu\n", fd, rc,
1a180 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41   iOff, TIMER_ELA
1a190 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20 72  PSED));..  if( r
1a1a0 63 3c 30 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  c<0 ) *piErrno =
1a1b0 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e   errno;.  return
1a1c0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1a1d0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1a1e0 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
1a1f0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
1a200 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
1a210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1a220 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1a230 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
1a240 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
1a250 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1a260 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1a270 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1a280 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61  led write the la
1a290 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1a2a0 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1a2b0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1a2c0 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a2d0 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
1a2e0 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63  d, i64 offset, c
1a2f0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1a300 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74   int cnt){.  ret
1a310 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65  urn seekAndWrite
1a320 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  Fd(id->h, offset
1a330 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64  , pBuf, cnt, &id
1a340 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a  ->lastErrno);.}.
1a350 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1a360 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1a370 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
1a380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1a390 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
1a3a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1a3b0 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
1a3c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a3d0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
1a3e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a3f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1a400 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1a410 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1a420 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
1a430 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1a440 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1a450 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
1a460 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1a470 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1a480 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1a490 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1a4a0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1a4b0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1a4c0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1a4d0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1a4e0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1a4f0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1a500 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1a510 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1a520 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1a530 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
1a540 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1a550 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1a560 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1a570 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1a580 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1a590 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a5a0 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
1a5b0 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1a5c0 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1a5d0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1a5e0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
1a5f0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1a600 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1a610 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1a620 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1a630 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
1a640 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
1a650 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
1a660 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1a670 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
1a680 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
1a690 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1a6a0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
1a6b0 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
1a6c0 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
1a6d0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1a6e0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
1a6f0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
1a700 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
1a710 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
1a720 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
1a730 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
1a740 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
1a750 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1a760 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
1a770 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
1a780 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1a790 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1a7a0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1a7b0 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
1a7c0 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
1a7d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a7e0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
1a7f0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
1a800 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
1a810 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
1a820 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
1a830 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1a840 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
1a850 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1a860 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
1a870 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
1a880 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1a890 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
1a8a0 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41  (SQLITE_MMAP_REA
1a8b0 44 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54  DWRITE) && SQLIT
1a8c0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1a8d0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1a8e0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1a8f0 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
1a900 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
1a910 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
1a920 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
1a930 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
1a940 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
1a950 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
1a960 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1a970 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
1a980 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
1a990 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
1a9a0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1a9b0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1a9c0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1a9d0 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
1a9e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a9f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aa00 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
1aa10 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
1aa20 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
1aa30 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1aa40 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1aa50 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1aa60 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
1aa70 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
1aa80 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
1aa90 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
1aaa0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
1aab0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1aac0 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65  #endif. .  while
1aad0 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  ( (wrote = seekA
1aae0 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
1aaf0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1ab00 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e  ))<amt && wrote>
1ab10 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  0 ){.    amt -= 
1ab20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65  wrote;.    offse
1ab30 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t += wrote;.    
1ab40 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
1ab50 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
1ab60 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  }.  SimulateIOEr
1ab70 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29  ror(( wrote=(-1)
1ab80 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69  , amt=1 ));.  Si
1ab90 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1aba0 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61  ror(( wrote=0, a
1abb0 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20  mt=1 ));..  if( 
1abc0 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20  amt>wrote ){.   
1abd0 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20   if( wrote<0 && 
1abe0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1abf0 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20  !=ENOSPC ){.    
1ac00 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
1ac10 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  et by seekAndWri
1ac20 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  te */.      retu
1ac30 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ac40 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
1ac50 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1ac60 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29  tErrno(pFile, 0)
1ac70 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
1ac80 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  m error */.     
1ac90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1aca0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
1acb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1acc0 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
1acd0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
1ace0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1acf0 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
1ad00 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
1ad10 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1ad20 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
1ad30 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
1ad40 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20  s are occurring 
1ad50 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
1ad60 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1ad70 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
1ad80 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
1ad90 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
1ada0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
1adb0 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74   We do not trust
1adc0 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76   systems to prov
1add0 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64  ide a working fd
1ade0 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65  atasync().  Some
1adf0 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64   do..** Others d
1ae00 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66  o no.  To be saf
1ae10 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b  e, we will stick
1ae20 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68   with the (sligh
1ae30 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66  tly slower).** f
1ae40 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b  sync(). If you k
1ae50 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79  now that your sy
1ae60 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72  stem does suppor
1ae70 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f  t fdatasync() co
1ae80 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e  rrectly,.** then
1ae90 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20   simply compile 
1aea0 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63  with -Dfdatasync
1aeb0 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44  =fdatasync or -D
1aec0 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a  HAVE_FDATASYNC.*
1aed0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1aee0 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 48 41  datasync) && !HA
1aef0 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64  VE_FDATASYNC.# d
1af00 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
1af10 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
1af20 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
1af30 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
1af40 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
1af50 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1af60 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
1af70 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
1af80 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
1af90 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
1afa0 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
1afb0 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
1afc0 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
1afd0 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
1afe0 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
1aff0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1b000 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
1b010 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1b020 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
1b030 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
1b040 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
1b050 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
1b060 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
1b070 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
1b080 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1b090 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
1b0a0 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
1b0b0 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
1b0c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
1b0d0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
1b0e0 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
1b0f0 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
1b100 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
1b110 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
1b120 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
1b130 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
1b140 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
1b150 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
1b160 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
1b170 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
1b180 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
1b190 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
1b1a0 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
1b1b0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
1b1c0 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
1b1d0 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
1b1e0 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
1b1f0 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
1b200 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1b210 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
1b220 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
1b230 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
1b240 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
1b250 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
1b260 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
1b270 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
1b280 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
1b290 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
1b2a0 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
1b2b0 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
1b2c0 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
1b2d0 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
1b2e0 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
1b2f0 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
1b300 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
1b310 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
1b320 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
1b330 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
1b340 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1b350 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
1b360 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
1b370 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
1b380 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
1b390 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
1b3a0 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
1b3b0 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
1b3c0 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
1b3d0 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
1b3e0 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
1b3f0 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
1b400 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
1b410 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
1b420 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
1b430 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
1b440 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
1b450 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
1b460 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
1b470 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
1b480 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
1b490 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
1b4a0 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
1b4b0 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
1b4c0 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
1b4d0 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
1b4e0 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
1b4f0 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
1b500 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
1b510 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
1b520 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
1b530 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
1b540 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
1b550 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
1b560 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
1b570 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1b580 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1b590 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
1b5a0 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
1b5b0 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
1b5c0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
1b5d0 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
1b5e0 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
1b5f0 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
1b600 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
1b610 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
1b620 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
1b630 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
1b640 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
1b650 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1b660 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b670 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
1b680 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
1b690 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
1b6a0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1b6b0 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
1b6c0 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
1b6d0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1b6e0 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
1b6f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1b700 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1b710 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1b720 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
1b730 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
1b740 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
1b750 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
1b760 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
1b770 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
1b780 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
1b790 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
1b7a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1b7b0 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
1b7c0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
1b7d0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
1b7e0 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
1b7f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1b800 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1b810 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1b820 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
1b830 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
1b840 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
1b850 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
1b860 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
1b870 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
1b880 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
1b890 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20   ** no-op.  But 
1b8a0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63 61 6c  go ahead and cal
1b8b0 6c 20 66 73 74 61 74 28 29 20 74 6f 20 76 61 6c  l fstat() to val
1b8c0 69 64 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20  idate the file. 
1b8d0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61   ** descriptor a
1b8e0 73 20 77 65 20 6e 65 65 64 20 61 20 6d 65 74 68  s we need a meth
1b8f0 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61 20  od to provoke a 
1b900 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67 0a 20  failure during. 
1b910 20 2a 2a 20 63 6f 76 65 72 61 74 65 20 74 65 73   ** coverate tes
1b920 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ting..  */.#ifde
1b930 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1b940 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
1b950 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 72 63  stat buf;.    rc
1b960 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
1b970 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20  buf);.  }.#elif 
1b980 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1b990 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1b9a0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1b9b0 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1b9c0 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1b9d0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1b9e0 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1b9f0 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1ba00 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1ba10 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1ba20 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1ba30 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1ba40 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1ba50 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1ba60 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1ba70 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1ba80 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1ba90 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1baa0 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1bab0 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1bac0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1bad0 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1bae0 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1baf0 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1bb00 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1bb10 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1bb20 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1bb30 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1bb40 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1bb50 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1bb60 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1bb70 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1bb80 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1bb90 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1bba0 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1bbb0 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1bbc0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1bbd0 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1bbe0 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1bbf0 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1bc00 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1bc10 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1bc20 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1bc30 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1bc40 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1bc50 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1bc60 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1bc70 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1bc80 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1bc90 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1bca0 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1bcb0 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1bcc0 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1bcd0 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1bce0 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1bcf0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1bd00 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1bd10 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1bd20 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1bd30 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1bd40 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1bd50 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1bd60 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1bd70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bd80 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1bd90 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1bda0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1bdb0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1bdc0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1bdd0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1bde0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1bdf0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1be00 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1be10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1be20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1be30 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1be40 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1be50 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1be60 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1be70 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1be80 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1be90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1bea0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1beb0 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1bec0 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1bed0 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1bee0 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1bef0 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1bf00 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1bf10 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1bf20 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1bf30 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1bf40 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1bf50 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1bf60 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1bf70 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1bf80 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1bf90 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1bfa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1bfb0 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1bfc0 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1bfd0 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1bfe0 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1bff0 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1c000 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1c010 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1c020 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1c030 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1c040 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1c050 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1c060 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1c070 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1c080 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1c090 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1c0a0 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1c0b0 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1c0c0 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1c0d0 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1c0e0 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1c0f0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1c100 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1c110 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1c120 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1c130 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1c140 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1c150 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1c160 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c170 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1c180 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1c190 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1c1a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c1b0 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1c1c0 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1c1d0 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1c1e0 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1c1f0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1c200 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1c210 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1c220 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1c230 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1c240 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1c250 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1c260 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1c270 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1c280 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1c290 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1c2a0 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>0 && zDirname[
1c2b0 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1c2c0 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1c2d0 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1c2e0 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b  = '\0';.  }else{
1c2f0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e 61 6d  .    if( zDirnam
1c300 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44 69 72  e[0]!='/' ) zDir
1c310 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20  name[0] = '.';. 
1c320 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d 20 3d     zDirname[1] =
1c330 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72   0;.  }.  fd = r
1c340 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e  obust_open(zDirn
1c350 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
1c360 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66  BINARY, 0);.  if
1c370 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f  ( fd>=0 ){.    O
1c380 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1c390 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1c3a0 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 7d   zDirname));.  }
1c3b0 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1c3c0 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65 74 75  if( fd>=0 ) retu
1c3d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c3e0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1c3f0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1c400 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 44  PEN_BKPT, "openD
1c410 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69 72 6e  irectory", zDirn
1c420 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ame);.}../*.** M
1c430 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1c440 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1c450 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1c460 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1c470 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1c480 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1c490 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1c4a0 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1c4b0 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1c4c0 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1c4d0 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1c4e0 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1c4f0 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1c500 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1c510 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1c520 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1c530 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1c540 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1c550 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1c560 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1c570 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1c580 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1c590 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1c5a0 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1c5b0 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1c5c0 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1c5d0 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1c5e0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1c5f0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1c600 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1c610 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1c620 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1c630 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1c640 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1c650 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1c660 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1c670 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1c680 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1c690 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1c6a0 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1c6b0 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1c6c0 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1c6d0 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1c6e0 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1c6f0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1c700 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1c710 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1c720 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c730 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1c740 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1c750 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c760 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1c770 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1c780 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1c790 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1c7a0 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1c7b0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1c7c0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1c7d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1c7e0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1c7f0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1c800 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1c810 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1c820 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1c830 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1c840 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1c850 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1c860 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1c870 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1c880 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1c890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1c8a0 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1c8b0 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1c8c0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1c8d0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1c8e0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1c8f0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1c900 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1c910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c920 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1c930 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1c940 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1c950 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1c960 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1c970 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1c980 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1c990 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1c9a0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1c9b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1c9c0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1c9d0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1c9e0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1c9f0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1ca00 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75  IOERR_FSYNC, "fu
1ca10 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65  ll_fsync", pFile
1ca20 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ->zPath);.  }.. 
1ca30 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74   /* Also fsync t
1ca40 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1ca50 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  taining the file
1ca60 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20   if the DIRSYNC 
1ca70 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1ca80 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65  .  This is a one
1ca90 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65  -time occurrence
1caa0 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20  .  Many systems 
1cab0 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a  (examples: AIX).
1cac0 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20    ** are unable 
1cad0 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63  to fsync a direc
1cae0 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20  tory, so ignore 
1caf0 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73  errors on the fs
1cb00 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ync..  */.  if( 
1cb10 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1cb20 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53   & UNIXFILE_DIRS
1cb30 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  YNC ){.    int d
1cb40 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43  irfd;.    OSTRAC
1cb50 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28  E(("DIRSYNC %s (
1cb60 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1cb70 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1cb80 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ", pFile->zPath,
1cb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1cba0 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1cbb0 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72  ullsync));.    r
1cbc0 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  c = osOpenDirect
1cbd0 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ory(pFile->zPath
1cbe0 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
1cbf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cc00 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66   ){.      full_f
1cc10 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30  sync(dirfd, 0, 0
1cc20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
1cc30 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72  close(pFile, dir
1cc40 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
1cc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1cc70 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20  TE_CANTOPEN );. 
1cc80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cc90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1cca0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1ccb0 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52  &= ~UNIXFILE_DIR
1ccc0 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SYNC;.  }.  retu
1ccd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cce0 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
1ccf0 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
1cd00 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
1cd10 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
1cd20 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1cd30 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
1cd40 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1cd50 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1cd60 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b   *)id;.  int rc;
1cd70 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1cd80 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
1cd90 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1cda0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1cdb0 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ATE );..  /* If 
1cdc0 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
1cdd0 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
1cde0 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
1cdf0 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
1ce00 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
1ce10 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
1ce20 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
1ce30 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
1ce40 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
1ce50 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
1ce60 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
1ce70 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
1ce80 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1ce90 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
1cea0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1ceb0 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1cec0 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
1ced0 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
1cee0 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
1cef0 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1cf00 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
1cf10 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72   rc = robust_ftr
1cf20 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1cf30 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72   nByte);.  if( r
1cf40 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  c ){.    storeLa
1cf50 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
1cf60 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  rrno);.    retur
1cf70 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1cf80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1cf90 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1cfa0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1cfb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
1cfc0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1cfd0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1cfe0 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1cff0 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1d000 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1d010 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1d020 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d030 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1d040 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1d050 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1d060 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1d070 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1d080 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1d090 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1d0a0 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1d0b0 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1d0c0 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d0d0 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1d0e0 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1d0f0 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1d100 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1d110 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1d120 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1d130 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1d140 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1d150 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1d160 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1d170 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1d180 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1d190 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1d1a0 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1d1b0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1d1c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
1d1d0 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75  ile was just tru
1d1e0 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
1d1f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1d200 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
1d210 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
1d220 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
1d230 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
1d240 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
1d250 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ite will.    ** 
1d260 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
1d270 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
1d280 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
1d290 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
1d2a0 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20   on.  .    */.  
1d2b0 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c    if( nByte<pFil
1d2c0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1d2d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1d2e0 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
1d2f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1d300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d310 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1d320 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1d330 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1d340 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1d350 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1d360 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1d370 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1d380 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1d390 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1d3a0 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1d3b0 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1d3c0 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1d3d0 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1d3e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1d3f0 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1d400 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72  c!=0 ){.    stor
1d410 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
1d420 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29  File*)id, errno)
1d430 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1d440 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1d450 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
1d460 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
1d470 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
1d480 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
1d490 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e  base, the findIn
1d4a0 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  odeInfo() proced
1d4b0 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
1d4c0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1d4d0 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
1d4e0 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
1d4f0 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
1d500 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
1d510 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
1d520 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1d530 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
1d540 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
1d550 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
1d560 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
1d570 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
1d580 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
1d590 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
1d5a0 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
1d5b0 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
1d5c0 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
1d5d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d5e0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
1d5f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1d600 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1d610 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
1d620 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
1d630 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
1d640 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
1d650 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
1d660 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
1d670 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
1d680 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1d690 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
1d6a0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1d6b0 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
1d6c0 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  endif../* .** Th
1d6d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1d6e0 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  alled to handle 
1d6f0 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
1d700 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66  _SIZE_HINT .** f
1d710 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72  ile-control oper
1d720 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20  ation.  Enlarge 
1d730 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1d740 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a  nBytes in size.*
1d750 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  * (rounded up to
1d760 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d   the next chunk-
1d770 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64  size).  If the d
1d780 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1d790 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20  dy.** nBytes or 
1d7a0 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75  larger, this rou
1d7b0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1d7c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1d7d0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69  cntlSizeHint(uni
1d7e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36  xFile *pFile, i6
1d7f0 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
1d800 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1d810 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a   ){.    i64 nSiz
1d820 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d830 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
1d840 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1d850 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1d860 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1d870 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64   /* Used to hold
1d880 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
1d890 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20  f fstat() */.   
1d8a0 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1d8b0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
1d8c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d8d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1d8e0 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  TAT;.    }..    
1d8f0 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1d900 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1d910 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1d920 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1d930 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1d940 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1d950 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1d960 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1d970 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1d980 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1d990 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1d9a0 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1d9b0 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1d9c0 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1d9d0 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1d9e0 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1d9f0 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1da00 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1da10 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1da20 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1da30 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1da40 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1da50 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1da60 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1da70 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1da80 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1da90 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1daa0 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1dab0 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1dac0 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1dad0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1dae0 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1daf0 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1db00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1db10 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1db20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1db30 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1db40 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1db50 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65  , fake it. Write
1db60 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e   a .      ** sin
1db70 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
1db80 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
1db90 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c  h block that fal
1dba0 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20  ls entirely.    
1dbb0 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20    ** within the 
1dbc0 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e  extended region.
1dbd0 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72   Then, if requir
1dbe0 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ed, a single byt
1dbf0 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  e.      ** at of
1dc00 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20  fset (nSize-1), 
1dc10 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  to set the size 
1dc20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72  of the file corr
1dc30 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20  ectly..      ** 
1dc40 54 68 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61  This is a simila
1dc50 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74  r technique to t
1dc60 68 61 74 20 75 73 65 64 20 62 79 20 67 6c 69 62  hat used by glib
1dc70 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20  c on systems.   
1dc80 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f     ** that do no
1dc90 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61  t have a real fa
1dca0 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a  llocate() call..
1dcb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1dcc0 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74  nt nBlk = buf.st
1dcd0 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69  _blksize;  /* Fi
1dce0 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20  le-system block 
1dcf0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  size */.      in
1dd00 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20  t nWrite = 0;   
1dd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dd20 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
1dd30 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57  tten by seekAndW
1dd40 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  rite */.      i6
1dd50 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 iWrite;       
1dd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1dd70 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74  t offset to writ
1dd80 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69  e to */..      i
1dd90 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73 74 5f  Write = (buf.st_
1dda0 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20  size/nBlk)*nBlk 
1ddb0 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20 20  + nBlk - 1;.    
1ddc0 20 20 61 73 73 65 72 74 28 20 69 57 72 69 74 65    assert( iWrite
1ddd0 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b  >=buf.st_size );
1dde0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1ddf0 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29  (iWrite+1)%nBlk)
1de00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
1de10 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69  (/*no-op*/; iWri
1de20 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b  te<nSize+nBlk-1;
1de30 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b   iWrite+=nBlk ){
1de40 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 57 72  .        if( iWr
1de50 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57 72  ite>=nSize ) iWr
1de60 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31 3b  ite = nSize - 1;
1de70 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20  .        nWrite 
1de80 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
1de90 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22  File, iWrite, ""
1dea0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1deb0 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65  ( nWrite!=1 ) re
1dec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ded0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d  R_WRITE;.      }
1dee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1def0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
1df00 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1df10 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
1df20 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74  izeMax>0 && nByt
1df30 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e>pFile->mmapSiz
1df40 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
1df50 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
1df60 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20  szChunk<=0 ){.  
1df70 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
1df80 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1df90 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  h, nByte) ){.   
1dfa0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1dfb0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1dfc0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1dfd0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1dfe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1dff0 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1e000 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1e010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e020 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61  .    rc = unixMa
1e030 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79  pfile(pFile, nBy
1e040 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  te);.    return 
1e050 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1e060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e070 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
1e080 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c  *pArg is initial
1e090 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
1e0a0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
1e0b0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
1e0c0 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
1e0d0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1e0e0 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
1e0f0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1e100 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
1e110 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
1e120 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
1e130 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
1e140 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
1e150 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
1e160 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
1e170 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
1e180 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
1e190 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
1e1a0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
1e1b0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
1e1c0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
1e1d0 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
1e1e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
1e1f0 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
1e200 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1e210 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
1e220 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e230 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
1e240 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
1e250 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
1e260 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e270 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
1e280 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1e290 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
1e2a0 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1e2b0 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1e2c0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1e2d0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1e2e0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1e2f0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1e300 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1e310 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e320 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e330 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1e340 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e350 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1e360 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1e370 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1e380 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1e390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e3a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1e3b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1e3c0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
1e3d0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1e3e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1e3f0 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
1e400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e410 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e420 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
1e430 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
1e440 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
1e450 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
1e460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e480 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1e490 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
1e4a0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53   int rc;.      S
1e4b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1e4c0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
1e4d0 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  c = fcntlSizeHin
1e4e0 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a  t(pFile, *(i64 *
1e4f0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69  )pArg);.      Si
1e500 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1e510 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65  ign(0);.      re
1e520 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1e530 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e540 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
1e550 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f  : {.      unixMo
1e560 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49  deBit(pFile, UNI
1e570 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
1e580 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
1e590 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e5a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e5b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e5c0 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
1e5d0 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
1e5e0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1e5f0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  le, UNIXFILE_PSO
1e600 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
1e610 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e620 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e630 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e640 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
1e650 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
1e660 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
1e670 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65  intf("%s", pFile
1e680 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pVfs->zName);.
1e690 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e6a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e6b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e6c0 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
1e6d0 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
1e6e0 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  zTFile = sqlite3
1e6f0 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65  _malloc64( pFile
1e700 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1e710 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
1e720 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
1e730 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d    unixGetTempnam
1e740 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  e(pFile->pVfs->m
1e750 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c  xPathname, zTFil
1e760 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68  e);.        *(ch
1e770 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
1e780 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
1e790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e7a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1e7b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e7c0 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20  HAS_MOVED: {.   
1e7d0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1e7e0 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46   fileHasMoved(pF
1e7f0 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ile);.      retu
1e800 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e810 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
1e820 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1e830 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e840 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
1e850 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c  {.      i64 newL
1e860 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41  imit = *(i64*)pA
1e870 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  rg;.      int rc
1e880 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e890 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1e8a0 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  >sqlite3GlobalCo
1e8b0 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20  nfig.mxMmap ){. 
1e8c0 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
1e8d0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1e8e0 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20  onfig.mxMmap;.  
1e8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36      }.      *(i6
1e900 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
1e910 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1e920 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1e930 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
1e940 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
1e950 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
1e960 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
1e970 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1e980 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
1e990 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
1e9a0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1e9b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1e9c0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
1e9d0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
1e9e0 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
1e9f0 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
1ea00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ea10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ea20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1ea30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ea40 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1ea50 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
1ea60 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
1ea70 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
1ea80 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
1ea90 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
1eaa0 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
1eab0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
1eac0 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
1ead0 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
1eae0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1eaf0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
1eb00 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
1eb10 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
1eb20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1eb30 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
1eb40 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
1eb50 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
1eb60 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
1eb70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1eb80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1eb90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1eba0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1ebb0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1ebc0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
1ebd0 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
1ebe0 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20  KPROXYFILE:.    
1ebf0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ec00 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_GET_LOCKPROXYF
1ec10 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ILE: {.      ret
1ec20 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  urn proxyFileCon
1ec30 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29  trol(id,op,pArg)
1ec40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1ec50 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1ec60 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1ec70 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1ec80 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  __) */.  }.  ret
1ec90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
1eca0 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
1ecb0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1ecc0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1ecd0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1ece0 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1ecf0 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1ed00 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1ed10 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1ed20 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1ed30 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1ed40 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1ed50 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1ed60 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1ed70 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1ed80 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1ed90 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1eda0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1edb0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1edc0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1edd0 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1ede0 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1edf0 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1ee00 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1ee10 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1ee20 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1ee30 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  oth..*/.#ifndef 
1ee40 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74  __QNXNTO__ .stat
1ee50 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1ee60 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1ee70 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  le *NotUsed){.  
1ee80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ee90 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1eea0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
1eeb0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1eec0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1eed0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65  The following ve
1eee0 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63  rsion of unixSec
1eef0 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70 74  torSize() is opt
1ef00 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a  imized for QNX..
1ef10 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  */.#ifdef __QNXN
1ef20 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  TO__.#include <s
1ef30 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23  ys/dcmd_blk.h>.#
1ef40 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
1ef50 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 69  tvfs.h>.static i
1ef60 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1ef70 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1ef80 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
1ef90 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1efa0 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46  le*)id;.  if( pF
1efb0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1efc0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75  == 0 ){.    stru
1efd0 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66  ct statvfs fsInf
1efe0 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f  o;.       .    /
1eff0 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66  * Set defaults f
1f000 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64  or non-supported
1f010 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a   filesystems */.
1f020 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f030 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1f040 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1f050 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  ZE;.    pFile->d
1f060 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f070 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  tics = 0;.    if
1f080 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65  ( fstatvfs(pFile
1f090 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ->h, &fsInfo) ==
1f0a0 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65   -1 ) {.      re
1f0b0 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
1f0c0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  orSize;.    }.. 
1f0d0 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 66     if( !strcmp(f
1f0e0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f0f0 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20  , "tmp") ) {.   
1f100 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1f110 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1f120 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1f130 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1f140 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1f150 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f160 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20  _ATOMIC4K |     
1f170 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c    /* All ram fil
1f180 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
1f190 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1f1a0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f1b0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
1f1c0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
1f1d0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1f1e0 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
1f220 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
1f230 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f240 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1f250 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1f260 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1f270 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1f2b0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1f2c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1f2d0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1f2e0 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66 73  _basetype, "etfs
1f2f0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
1f300 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1f310 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1f320 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1f330 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f340 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
1f350 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a  etfs cluster siz
1f360 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  e writes are ato
1f370 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  mic */.        (
1f380 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f390 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
1f3a0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1f3b0 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  ) |.        SQLI
1f3c0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f3d0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f3e0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f3f0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f400 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f430 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f440 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f450 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f460 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f470 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f480 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f490 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f4c0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f4d0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f4e0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1f4f0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f500 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20  e, "qnx6") ){.  
1f510 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f520 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f530 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f540 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f550 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f560 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f570 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20  P_ATOMIC |      
1f580 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79     /* All filesy
1f590 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
1f5a0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1f5b0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1f5c0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1f5d0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1f5e0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1f5f0 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f620 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1f630 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1f640 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f650 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1f660 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1f670 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1f680 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f6b0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1f6c0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1f6d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
1f6e0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
1f6f0 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29  asetype, "qnx4")
1f700 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1f710 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1f720 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1f730 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f740 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f750 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
1f760 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
1f770 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
1f780 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
1f790 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
1f7a0 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
1f7b0 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
1f7c0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f7d0 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
1f7e0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f7f0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f800 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1f810 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1f820 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1f830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f850 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1f860 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1f870 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1f880 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
1f890 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1f8a0 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20   "dos") ){.     
1f8b0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f8c0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1f8d0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1f8e0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f8f0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f900 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
1f910 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
1f920 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
1f930 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
1f940 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
1f950 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1f960 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1f970 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
1f980 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
1f990 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f9a0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1f9b0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1f9c0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1f9d0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1fa00 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1fa10 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1fa20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fa30 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1fa40 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1fa50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1fa60 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c  OCAP_ATOMIC512 |
1fa70 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20        /* blocks 
1fa80 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1fa90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1faa0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1fab0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1fac0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1fad0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1fb10 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1fb20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d      0;.    }.  }
1fb30 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63  .  /* Last chanc
1fb40 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20  e verification. 
1fb50 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   If the sector s
1fb60 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74  ize isn't a mult
1fb70 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a  iple of 512.  **
1fb80 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76   then it isn't v
1fb90 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46  alid.*/.  if( pF
1fba0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1fbb0 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20  % 512 != 0 ){.  
1fbc0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1fbd0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1fbe0 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   0;.    pFile->s
1fbf0 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
1fc00 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1fc10 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65  R_SIZE;.  }.  re
1fc20 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
1fc30 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  orSize;.}.#endif
1fc40 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a   /* __QNXNTO__ *
1fc50 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
1fc60 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
1fc70 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
1fc80 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
1fc90 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75  his VFS is set u
1fca0 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  p to return SQLI
1fcb0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1fcc0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20  FE_OVERWRITE by 
1fcd0 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65  default..** Howe
1fce0 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65  ver, that choice
1fcf0 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61   is controversia
1fd00 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61  l since technica
1fd10 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69  lly the underlyi
1fd20 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  ng.** file syste
1fd30 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79  m does not alway
1fd40 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73  s provide powers
1fd50 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20  afe overwrites. 
1fd60 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f   (In other.** wo
1fd70 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77  rds, after a pow
1fd80 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70  er-loss event, p
1fd90 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65  arts of the file
1fda0 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72   that were never
1fdb0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68  .** written migh
1fdc0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61  t end up being a
1fdd0 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65  ltered.)  Howeve
1fde0 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61  r, non-PSOW beha
1fdf0 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a  vior is very,.**
1fe00 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64   very rare.  And
1fe10 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20   asserting PSOW 
1fe20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65  makes a large re
1fe30 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61  duction in the a
1fe40 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75  mount.** of requ
1fe50 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75  ired I/O for jou
1fe60 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61  rnaling, since a
1fe70 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20   lot of padding 
1fe80 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a  is eliminated..*
1fe90 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20  *  Hence, while 
1fea0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1feb0 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ITE is on by def
1fec0 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61  ault, there is a
1fed0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a   file-control.**
1fee0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
1fef0 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52  rn it off and UR
1ff00 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  I query paramete
1ff10 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  r available to t
1ff20 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73  urn it off..*/.s
1ff30 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
1ff40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ff50 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
1ff60 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
1ff70 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
1ff80 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
1ff90 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58   0;.#ifdef __QNX
1ffa0 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73  NTO__.  if( p->s
1ffb0 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75  ectorSize==0 ) u
1ffc0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69 64  nixSectorSize(id
1ffd0 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65 76  );.  rc = p->dev
1ffe0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1fff0 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  cs;.#endif.  if(
20000 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20   p->ctrlFlags & 
20010 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b  UNIXFILE_PSOW ){
20020 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54  .    rc |= SQLIT
20030 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
20040 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d  E_OVERWRITE;.  }
20050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20060 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
20070 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
20080 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
20090 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20  P_SIZE>0../*.** 
200a0 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74 65  Return the syste
200b0 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  m page size..**.
200c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
200d0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
200e0 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62  alled directly b
200f0 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20  y other code in 
20100 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49  this file. .** I
20110 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c  nstead, it shoul
20120 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20  d be called via 
20130 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73  macro osGetpages
20140 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ize()..*/.static
20150 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65   int unixGetpage
20160 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20  size(void){.#if 
20170 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
20180 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20  urn 1024;.#elif 
20190 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55  defined(_BSD_SOU
201a0 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65  RCE).  return ge
201b0 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c  tpagesize();.#el
201c0 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  se.  return (int
201d0 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47  )sysconf(_SC_PAG
201e0 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d  ESIZE);.#endif.}
201f0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
20200 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20210 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
20220 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
20230 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
20240 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
20250 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
20260 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73  o represent an s
20270 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66  hared memory buf
20280 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  fer.  .**.** Whe
20290 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
202a0 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
202b0 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e   the same wal-in
202c0 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64  dex, each thread
202d0 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20  .** has its own 
202e0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20  unixShm object, 
202f0 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69  but they all poi
20300 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
20310 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
20320 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
20330 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
20340 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c   words, each wal
20350 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64  -index is opened
20360 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  .** only once pe
20370 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
20380 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64   Each unixShmNod
20390 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e  e object is conn
203a0 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c  ected to a singl
203b0 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
203c0 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f  object..** We co
203d0 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69  uld coalesce thi
203e0 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e  s object into un
203f0 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74  ixInodeInfo, but
20400 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e   that would mean
20410 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66  .** every open f
20420 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ile that does no
20430 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d  t use shared mem
20440 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ory (in other wo
20450 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65  rds, most.** ope
20460 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68  n files) would h
20470 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f  ave to carry aro
20480 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69  und this extra i
20490 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a  nformation.  So.
204a0 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ** the unixInode
204b0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74  Info object cont
204c0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
204d0 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  o this unixShmNo
204e0 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64  de object.** and
204f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
20500 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
20510 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65  ed only when nee
20520 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d  ded..**.** unixM
20530 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
20540 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
20550 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
20560 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
20570 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
20580 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
20590 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
205a0 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
205b0 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nRef.**.** The f
205c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
205d0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
205e0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
205f0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
20600 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
20610 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
20620 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68  ** Either unixSh
20630 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74  mNode.mutex must
20640 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78   be held or unix
20650 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
20660 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  and.** unixMutex
20670 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
20680 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
20690 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
206a0 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
206b0 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  s structure..*/.
206c0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
206d0 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  de {.  unixInode
206e0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
206f0 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e    /* unixInodeIn
20700 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69  fo that owns thi
20710 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20  s SHM node */.  
20720 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
20730 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
20740 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
20750 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
20760 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
20770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
20780 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64  e of the mmapped
20790 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68   file */.  int h
207a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
207b0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
207c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
207d0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
207f0 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
20800 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
20810 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b  /.  u16 nRegion;
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20830 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
20840 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38  apRegion */.  u8
20850 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20   isReadonly;    
20860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20870 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f   if read-only */
20880 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69  .  char **apRegi
20890 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
208a0 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64   Array of mapped
208b0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
208c0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
208d0 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
208e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
208f0 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65   of unixShm obje
20900 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
20910 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  this */.  unixSh
20920 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
20930 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78       /* All unix
20940 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
20950 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
20960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20970 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73  BUG.  u8 exclMas
20980 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
20990 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
209a0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
209b0 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
209c0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
209d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
209e0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
209f0 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a10 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
20a20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65  unixShm.id value
20a30 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
20a40 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
20a50 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
20a60 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
20a70 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
20a80 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
20a90 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
20aa0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
20ab0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
20ac0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
20ad0 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
20ae0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
20af0 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
20b00 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
20b10 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  *.**    unixShm.
20b20 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78  pFile.**    unix
20b30 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
20b40 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
20b50 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
20b60 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
20b70 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
20b80 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
20b90 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
20ba0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
20bb0 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
20bc0 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65   {.  unixShmNode
20bd0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
20be0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
20bf0 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  g unixShmNode ob
20c00 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ject */.  unixSh
20c10 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
20c20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69       /* Next uni
20c30 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  xShm with the sa
20c40 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  me unixShmNode *
20c50 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c70 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
20c80 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  g the unixShmNod
20c90 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20  e mutex */.  u8 
20ca0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
20cb0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
20cc0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
20cd0 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78   within its unix
20ce0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36  ShmNode */.  u16
20cf0 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
20d00 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
20d10 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
20d20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
20d30 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
20d40 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20d50 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
20d60 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  held */.};../*.*
20d70 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
20d80 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
20d90 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
20da0 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
20db0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
20dc0 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  )         /* fir
20dd0 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
20de0 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
20df0 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48  _DMS    (UNIX_SH
20e00 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
20e10 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
20e20 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
20e30 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69  /*.** Apply posi
20e40 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x advisory locks
20e50 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66   for all bytes f
20e60 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68  rom ofst through
20e70 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a   ofst+n-1..**.**
20e80 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20   Locks block if 
20e90 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63  the mask is exac
20ea0 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61  tly UNIX_SHM_C a
20eb0 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b  nd are non-block
20ec0 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ing.** otherwise
20ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20ee0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
20ef0 6b 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  k(.  unixFile *p
20f00 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f  File,       /* O
20f10 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  pen connection t
20f20 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a  o the WAL file *
20f30 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
20f40 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
20f50 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
20f60 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
20f70 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
20f80 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20f90 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
20fa0 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
20fb0 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
20fc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20fd0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
20fe0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
20ff0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
21000 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
21010 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
21020 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
21030 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  t */.  struct fl
21040 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a  ock f;        /*
21050 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   The posix advis
21060 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ory locking stru
21070 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72  cture */.  int r
21080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
21090 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
210a0 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
210b0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
210c0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
210d0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
210e0 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
210f0 6c 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64  ler */.  pShmNod
21100 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
21110 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
21120 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21130 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
21140 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53  de->mutex) || pS
21150 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
21160 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20  );..  /* Shared 
21170 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e  locks never span
21180 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
21190 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  yte */.  assert(
211a0 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70   n==1 || lockTyp
211b0 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20  e!=F_RDLCK );.. 
211c0 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69   /* Locks are wi
211d0 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  thin range */.  
211e0 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20  assert( n>=1 && 
211f0 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
21200 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
21210 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
21220 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
21230 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
21240 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
21250 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
21260 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
21270 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
21280 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
21290 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
212a0 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
212b0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
212c0 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
212d0 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
212e0 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
212f0 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
21300 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
21310 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
21320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
21330 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
21340 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
21350 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
21360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21370 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
21380 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
21390 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
213a0 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30  sk = ofst>31 ? 0
213b0 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73  xffff : (1<<(ofs
213c0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
213d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
213e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
213f0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
21400 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
21410 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
21420 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21430 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21440 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
21450 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21460 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
21470 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  mask;.    }else 
21480 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
21490 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
214a0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
214b0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
214c0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
214d0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
214e0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
214f0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
21500 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65   |= mask;.    }e
21510 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
21520 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
21530 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
21540 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
21550 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
21560 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
21570 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  e->exclMask |= m
21580 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
21590 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
215a0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a  &= ~mask;.    }.
215b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
215c0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
215d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
215e0 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
215f0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
21600 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
21610 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
21620 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21630 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61  E(("read-lock fa
21640 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
21650 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21660 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
21670 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
21680 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
21690 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
216a0 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
216b0 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61    OSTRACE((" - a
216c0 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25  fterwards %03x,%
216d0 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
216e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
216f0 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64  redMask, pShmNod
21700 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  e->exclMask));. 
21710 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
21720 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
21730 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21740 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62  the minimum numb
21750 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72  er of 32KB shm r
21760 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75  egions that shou
21770 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a  ld be mapped at.
21780 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d  ** a time, assum
21790 69 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d 61  ing that each ma
217a0 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e  pping must be an
217b0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
217c0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  e of the.** curr
217d0 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d  ent system page-
217e0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61  size..**.** Usua
217f0 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20  lly, this is 1. 
21800 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65  The exception se
21810 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d  ems to be system
21820 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69  s that are confi
21830 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20  gured.** to use 
21840 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20  64KB pages - in 
21850 74 68 69 73 20 63 61 73 65 20 65 61 63 68 20 6d  this case each m
21860 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65  apping must cove
21870 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a  r at least two.*
21880 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a  * shm regions..*
21890 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
218a0 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70  xShmRegionPerMap
218b0 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68  (void){.  int sh
218c0 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20  msz = 32*1024;  
218d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d            /* SHM
218e0 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a   region size */.
218f0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47    int pgsz = osG
21900 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20  etpagesize();   
21910 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20 73  /* System page s
21920 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ize */.  assert(
21930 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29   ((pgsz-1)&pgsz)
21940 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65  ==0 );   /* Page
21950 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
21960 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20  power of 2 */.  
21970 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29  if( pgsz<shmsz )
21980 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
21990 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a  urn pgsz/shmsz;.
219a0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  }../*.** Purge t
219b0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
219c0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
219d0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
219e0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
219f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
21a00 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
21a10 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
21a20 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
21a30 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
21a40 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
21a50 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
21a60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
21a70 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
21a80 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
21a90 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
21aa0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
21ab0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
21ac0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
21ad0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c  );.  if( p && AL
21ae0 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d 30 29  WAYS(p->nRef==0)
21af0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d   ){.    int nShm
21b00 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d  PerMap = unixShm
21b10 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a  RegionPerMap();.
21b20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61      int i;.    a
21b30 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65  ssert( p->pInode
21b40 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  ==pFd->pInode );
21b50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
21b60 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
21b70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
21b80 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
21b90 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20  =nShmPerMap){.  
21ba0 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
21bb0 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
21bc0 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
21bd0 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
21be0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21c00 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
21c10 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
21c20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
21c30 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
21c40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
21c50 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
21c60 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
21c70 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
21c80 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
21c90 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
21ca0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
21cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21cc0 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
21cd0 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
21ce0 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
21cf0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
21d00 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
21d10 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
21d20 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
21d30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
21d40 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
21d50 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
21d60 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
21d70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
21d80 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
21d90 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
21da0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
21db0 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
21dc0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
21dd0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
21de0 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
21df0 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
21e00 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
21e10 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
21e20 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
21e30 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
21e40 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
21e50 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
21e60 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
21e70 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
21e80 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
21e90 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
21ea0 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
21eb0 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
21ec0 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
21ed0 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
21ee0 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
21ef0 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
21f00 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
21f10 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
21f20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
21f30 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
21f40 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21f50 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
21f60 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
21f70 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
21f80 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
21f90 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
21fa0 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
21fb0 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
21fc0 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
21fd0 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
21fe0 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
21ff0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
22000 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
22010 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
22020 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
22030 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
22040 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
22050 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
22060 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
22070 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
22080 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
22090 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
220a0 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
220b0 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
220c0 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
220d0 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
220e0 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
220f0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
22100 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
22110 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
22120 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
22130 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
22140 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
22150 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
22160 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
22170 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
22180 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
22190 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
221a0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
221b0 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
221c0 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
221d0 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
221e0 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
221f0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
22200 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
22210 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
22220 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
22230 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
22240 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
22250 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
22260 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
22270 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
22280 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
22290 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
222a0 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
222b0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
222c0 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
222d0 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
222e0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
222f0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
22300 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
22310 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
22320 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
22330 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
22340 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
22350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
22360 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
22370 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
22380 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
22390 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
223a0 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
223b0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
223c0 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
223d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
223e0 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
223f0 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
22400 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
22410 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
22420 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
22430 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
22440 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
22450 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
22460 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
22470 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
22480 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
22490 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
224a0 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
224b0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
224c0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
224d0 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
224e0 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
224f0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
22500 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
22510 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
22520 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
22530 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
22540 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
22550 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
22560 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
22570 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22590 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
225a0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
225b0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
225c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
225d0 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
225e0 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
225f0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
22600 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
22610 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
22620 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
22630 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
22640 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
22650 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
22660 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
22670 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
22680 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
22690 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
226a0 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
226b0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
226c0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
226d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
226e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
226f0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
22700 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
22710 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
22720 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
22730 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
22740 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
22750 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
22760 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
22770 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
22780 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
22790 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
227a0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
227b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
227c0 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
227d0 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
227e0 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
227f0 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
22800 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
22810 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
22820 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
22830 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
22840 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
22850 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66   file */.#ifndef
22860 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22870 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20  CTORY.    const 
22880 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20  char *zBasePath 
22890 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a  = pDbFd->zPath;.
228a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
228b0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
228c0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
228d0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
228e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
228f0 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
22900 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
22910 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
22920 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
22930 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
22940 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
22950 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
22960 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
22970 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
22980 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
22990 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
229a0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67  R_FSTAT;.      g
229b0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
229c0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
229d0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
229e0 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c  TORY.    nShmFil
229f0 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53  ename = sizeof(S
22a00 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
22a10 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65  ORY) + 31;.#else
22a20 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
22a30 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72  e = 6 + (int)str
22a40 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a  len(zBasePath);.
22a50 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
22a60 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
22a70 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
22a80 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d  pShmNode) + nShm
22a90 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
22aa0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
22ab0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22ac0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22ad0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
22ae0 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
22af0 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
22b00 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
22b10 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
22b20 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65  e);.    zShmFile
22b30 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  name = pShmNode-
22b40 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
22b50 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d  ar*)&pShmNode[1]
22b60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22b70 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
22b80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
22b90 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
22ba0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a   zShmFilename, .
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
22bd0 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
22be0 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
22c10 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
22c20 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
22c30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
22c40 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
22c50 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
22c60 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73  , "%s-shm", zBas
22c70 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
22c80 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
22c90 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68  DbFd->zPath, zSh
22ca0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  mFilename);.#end
22cb0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
22cc0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
22cd0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
22ce0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
22cf0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
22d00 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
22d10 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
22d20 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
22d30 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
22d40 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
22d50 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
22d60 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
22d70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22d80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22d90 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
22da0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
22db0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
22dc0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
22dd0 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61       int openFla
22de0 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
22df0 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28  CREAT;.      if(
22e00 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
22e10 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  lean(pDbFd->zPat
22e20 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
22e30 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
22e40 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
22e50 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70  DONLY;.        p
22e60 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
22e70 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
22e80 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
22e90 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
22ea0 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f  (zShmFilename, o
22eb0 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74  penFlags, (sStat
22ec0 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
22ed0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
22ee0 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
22ef0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
22f00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
22f10 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
22f20 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
22f30 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
22f40 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
22f50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
22f60 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
22f70 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
22f80 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ot, make sure th
22f90 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a  at the SHM file.
22fa0 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65        ** is owne
22fb0 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73  d by the same us
22fc0 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65  er that owns the
22fd0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22fe0 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  se.  Otherwise,.
22ff0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
23000 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c  ginal owner will
23010 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
23020 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a  connect..      *
23030 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63  /.      robustFc
23040 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
23050 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
23060 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20  sStat.st_gid);. 
23070 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b   .      /* Check
23080 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
23090 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
230a0 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
230b0 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20  an switch..     
230c0 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
230d0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
230e0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20   zero length. . 
230f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
23100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23110 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53      if( unixShmS
23120 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
23130 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
23140 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
23150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23160 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
23170 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
23180 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
23190 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
231a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
231b0 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
231c0 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
231d0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
231e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
231f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23200 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23210 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
23220 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
23230 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
23240 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
23250 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
23260 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
23270 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
23280 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
23290 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
232a0 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
232b0 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
232c0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
232d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
232e0 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
232f0 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
23300 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
23310 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
23320 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
23330 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
23340 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
23350 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
23360 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
23370 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
23380 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
23390 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
233a0 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
233b0 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
233c0 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
233d0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
233e0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
233f0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
23400 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
23410 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
23420 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
23430 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
23440 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
23450 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
23460 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
23470 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
23480 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
23490 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
234a0 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
234b0 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
234c0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
234d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
234e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
234f0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
23500 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
23510 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
23520 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
23530 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
23540 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23560 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
23570 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
23580 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
23590 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
235a0 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
235b0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
235c0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
235d0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
235e0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
235f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
23600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23610 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23620 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
23630 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
23640 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
23650 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
23660 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
23670 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
23680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
23690 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
236a0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
236b0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
236c0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
236d0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
236e0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
236f0 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
23700 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
23710 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
23720 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
23730 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
23740 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
23750 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
23760 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
23770 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
23780 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
23790 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
237a0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
237b0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
237c0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
237d0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
237e0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
237f0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
23800 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
23810 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
23820 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
23830 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
23840 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
23850 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
23860 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23870 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
23880 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
23890 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
238a0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
238b0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
238c0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
238d0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
238e0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
238f0 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
23900 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
23910 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
23920 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
23930 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
23940 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
23950 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
23960 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
23970 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
23980 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
23990 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
239a0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
239b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
239c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
239d0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
239e0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
239f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
23a00 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
23a10 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
23a20 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a40 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
23a50 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
23a60 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
23a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
23a80 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
23a90 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
23ac0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
23ad0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
23ae0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
23af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23b00 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
23b10 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
23b20 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
23b30 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
23b40 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
23b50 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
23b60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23b70 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
23b80 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
23b90 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
23ba0 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
23bb0 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
23bc0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
23bd0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
23be0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
23bf0 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
23c00 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
23c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
23c20 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
23c30 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
23c40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23c50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
23c60 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
23c70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
23c80 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
23c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
23ca0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
23cb0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
23cc0 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
23cd0 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
23ce0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
23cf0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
23d00 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
23d10 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
23d20 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
23d30 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
23d40 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
23d50 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
23d60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23d70 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
23d80 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
23d90 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
23da0 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e  ..  /* Minimum n
23db0 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73  umber of regions
23dc0 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
23dd0 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65  mapped. */.  nRe
23de0 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67  qRegion = ((iReg
23df0 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20  ion+nShmPerMap) 
23e00 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20  / nShmPerMap) * 
23e10 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69  nShmPerMap;..  i
23e20 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
23e30 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
23e40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
23e50 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
23e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23e70 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
23e80 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
23e90 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a  te = nReqRegion*
23ea0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d  szRegion;   /* M
23eb0 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
23ec0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
23ed0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
23ee0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
23ef0 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
23f00 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
23f10 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
23f20 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
23f30 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
23f40 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
23f50 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
23f60 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
23f70 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
23f80 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
23f90 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
23fa0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23fb0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
23fc0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
23fd0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
23fe0 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
23ff0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
24000 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
24010 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
24020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
24030 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
24040 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
24050 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24060 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
24070 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
24080 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
24090 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
240a0 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
240b0 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
240c0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
240d0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
240e0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
240f0 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
24100 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
24110 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
24120 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
24130 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
24140 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24150 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
24160 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
24170 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
24180 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24190 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
241a0 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
241b0 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
241c0 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65  nd is true, exte
241d0 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20  nd the file. Do 
241e0 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
241f0 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  ** writing a sin
24200 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
24210 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29  end of each (OS)
24220 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20   page being.    
24230 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
24240 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65   or extended. Te
24250 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65  chnically, we ne
24260 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f  ed only write to
24270 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
24280 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64  last page in ord
24290 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  er to extend the
242a0 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69   file. But writi
242b0 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20  ng to all new.  
242c0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66        ** pages f
242d0 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20  orces the OS to 
242e0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d  allocate them im
242f0 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68  mediately, which
24300 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20   reduces.       
24310 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20   ** the chances 
24320 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20  of SIGBUS while 
24330 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61  accessing the ma
24340 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65  pped region late
24350 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  r on..        */
24360 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  .        else{. 
24370 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
24380 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
24390 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20   4096;.         
243a0 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20   int iPg;..     
243b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
243c0 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
243d0 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c  f each newly all
243e0 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64  ocated or extend
243f0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
24400 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42       assert( (nB
24410 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29  yte % pgsz)==0 )
24420 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
24430 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69  iPg=(sStat.st_si
24440 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e  ze/pgsz); iPg<(n
24450 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b  Byte/pgsz); iPg+
24460 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
24470 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
24480 20 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41         if( seekA
24490 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f  ndWriteFd(pShmNo
244a0 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20  de->h, iPg*pgsz 
244b0 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c  + pgsz-1, "", 1,
244c0 20 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20   &x)!=1 ){.     
244d0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
244e0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68  har *zFile = pSh
244f0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
24500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24510 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
24520 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
24530 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c  HMSIZE, "write",
24540 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20   zFile);.       
24550 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
24560 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
24570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24580 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24590 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
245a0 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
245b0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
245c0 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
245d0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
245e0 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
245f0 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ew = (char **)sq
24600 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
24610 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
24620 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52  >apRegion, nReqR
24630 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61  egion*sizeof(cha
24640 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  r *).    );.    
24650 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
24660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24670 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
24680 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24690 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
246a0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
246b0 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
246c0 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
246d0 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69  nRegion<nReqRegi
246e0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  on ){.      int 
246f0 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a  nMap = szRegion*
24700 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
24710 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76    int i;.      v
24720 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  oid *pMem;.     
24730 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
24740 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
24750 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  Mem = osMmap(0, 
24760 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20  nMap,.          
24770 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
24780 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
24790 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
247a0 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
247b0 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
247c0 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
247d0 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70   szRegion*(i64)p
247e0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
247f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
24800 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
24810 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
24820 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24830 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24840 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
24850 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
24860 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
24870 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24880 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
24890 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
248a0 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
248b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a  ite3_malloc64(sz
248c0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
248d0 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a   if( pMem==0 ){.
248e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
248f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
24900 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
24910 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
24920 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65   }.        memse
24930 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67  t(pMem, 0, szReg
24940 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ion);.      }.. 
24950 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24960 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29  nShmPerMap; i++)
24970 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
24980 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
24990 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69  mNode->nRegion+i
249a0 5d 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65  ] = &((char*)pMe
249b0 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a  m)[szRegion*i];.
249c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
249d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20  hmNode->nRegion 
249e0 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  += nShmPerMap;. 
249f0 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
24a00 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
24a10 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
24a20 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
24a30 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
24a40 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
24a50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
24a60 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
24a70 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
24a80 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
24a90 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
24aa0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
24ab0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
24ac0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
24ad0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
24ae0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
24af0 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
24b00 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
24b10 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
24b20 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
24b30 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
24b40 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
24b50 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
24b60 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
24b70 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
24b80 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
24b90 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
24ba0 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
24bb0 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
24bc0 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
24bd0 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
24be0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
24bf0 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
24c00 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
24c10 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
24c20 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
24c30 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
24c40 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
24c50 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
24c60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
24c70 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
24c80 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
24c90 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
24ca0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
24cb0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
24cc0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24cd0 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
24ce0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
24cf0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
24d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24d10 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
24d20 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
24d30 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
24d40 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
24d50 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
24d60 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
24d70 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
24d80 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
24d90 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
24da0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
24db0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
24dc0 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
24dd0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
24de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24df0 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
24e00 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
24e10 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
24e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
24e40 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
24e50 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
24e60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
24e70 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
24e80 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
24e90 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
24ea0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
24eb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24ed0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
24ee0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
24f10 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
24f20 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
24f30 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24f40 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
24f50 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
24f60 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24f70 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
24f80 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
24f90 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
24fa0 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
24fb0 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
24fc0 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
24fd0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
24fe0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
24ff0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
25000 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
25010 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
25020 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
25030 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
25040 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
25050 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
25060 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
25070 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
25080 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
25090 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
250a0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
250b0 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
250c0 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
250d0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
250e0 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
250f0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
25100 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
25110 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
25120 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
25130 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25140 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
25150 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
25160 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61  Lock==0 );..  ma
25170 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
25180 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
25190 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
251a0 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
251b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
251c0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
251d0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
251e0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
251f0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
25200 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
25210 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
25220 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
25230 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
25240 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
25250 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
25260 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
25270 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
25280 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
25290 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
252a0 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
252b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
252c0 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
252d0 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
252e0 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
252f0 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
25300 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
25310 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
25320 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
25330 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
25340 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
25350 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
25360 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
25370 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
25380 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e  Lock(pDbFd, F_UN
25390 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
253a0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
253b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
253c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
253d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
253e0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
253f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25410 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
25420 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
25430 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
25440 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
25450 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
25460 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
25470 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
25480 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
25490 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
254a0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
254b0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
254c0 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
254d0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
254e0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
254f0 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
25500 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
25510 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
25520 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
25530 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
25540 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
25550 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
25560 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
25570 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
25580 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
25590 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
255a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
255b0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
255c0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
255d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
255e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
255f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25600 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
25610 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
25620 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
25630 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
25640 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
25650 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
25660 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
25670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25680 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
25690 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
256a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
256b0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
256c0 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
256d0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
256e0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
256f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25720 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
25730 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
25740 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25760 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25770 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
25780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25790 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
257a0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
257b0 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
257c0 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
257d0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
257e0 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
257f0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
25800 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
25810 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25820 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25830 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25840 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25850 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25860 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
25870 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
25880 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25890 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
258a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
258b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
258c0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
258d0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
258e0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
258f0 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
25900 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
25910 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
25920 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
25930 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
25940 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25960 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25970 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
25980 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
25990 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
259a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
259b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
259c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
259d0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
259e0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
259f0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
25a00 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
25a10 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
25a20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
25a30 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25a40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
25a50 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
25a60 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
25a70 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
25a80 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74      p->id, osGet
25a90 70 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65  pid(0), p->share
25aa0 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
25ab0 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
25ac0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
25ad0 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
25ae0 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
25af0 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
25b00 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
25b10 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
25b20 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
25b30 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
25b40 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
25b50 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
25b60 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
25b70 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
25b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25b90 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
25ba0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25bb0 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
25bc0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
25bd0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
25be0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
25bf0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
25c00 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71  AMETER(fd);.  sq
25c10 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69  lite3MemoryBarri
25c20 65 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  er();         /*
25c30 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65   compiler-define
25c40 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  d memory barrier
25c50 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
25c60 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 20  utex();         
25c70 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75        /* Also mu
25c80 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61  tex, for redunda
25c90 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61  ncy */.  unixLea
25ca0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
25cb0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
25cc0 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
25cd0 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
25ce0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
25cf0 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
25d00 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
25d10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
25d20 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
25d30 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
25d40 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
25d50 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
25d60 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
25d70 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
25d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
25d90 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
25da0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25dc0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
25dd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25de0 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e00 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
25e10 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
25e20 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
25e30 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
25e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25e50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
25e60 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
25e70 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
25e80 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
25e90 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25ea0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
25eb0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
25ec0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
25ed0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25ee0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
25ef0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
25f00 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
25f10 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
25f20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
25f30 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
25f40 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
25f50 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
25f60 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
25f70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
25f80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25f90 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
25fa0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
25fb0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25fc0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
25fd0 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
25fe0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25ff0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
26000 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
26010 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
26020 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
26030 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
26040 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
26050 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
26060 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
26070 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
26080 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
26090 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
260a0 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
260b0 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
260c0 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
260d0 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
260e0 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
260f0 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
26100 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
26110 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
26120 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
26130 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
26140 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
26150 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
26160 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
26170 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
26180 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
26190 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
261a0 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
261b0 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
261c0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
261d0 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
261e0 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
261f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
26200 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
26210 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
26220 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
26230 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53       osUnlink(pS
26240 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
26250 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  e);.    }.    un
26260 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
26270 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
26280 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
26290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
262a0 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
262b0 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
262c0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
262d0 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
262e0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
262f0 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
26300 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
26310 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
26320 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26330 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  WAL */..#if SQLI
26340 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
26350 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  >0./*.** If it i
26360 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f  s currently memo
26370 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70  ry mapped, unmap
26380 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74   file pFd..*/.st
26390 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
263a0 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
263b0 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
263c0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
263d0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
263e0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
263f0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64      osMunmap(pFd
26400 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46  ->pMapRegion, pF
26410 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26420 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61  l);.    pFd->pMa
26430 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
26440 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
26450 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
26460 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
26470 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
26480 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
26490 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
264a0 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e  ory mapping main
264b0 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a  tained by file .
264c0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
264d0 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e  d to nNew bytes.
264e0 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   Any existing ma
264f0 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64  pping is discard
26500 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
26510 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
26520 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
26530 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
26540 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
26550 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65   unixFile.pMapRe
26560 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e  gion.**       un
26570 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a  ixFile.mmapSize.
26580 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
26590 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  e.mmapSizeActual
265a0 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63  .**.** If unsucc
265b0 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72  essful, an error
265c0 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67   message is logg
265d0 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c  ed via sqlite3_l
265e0 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20  og() and.** the 
265f0 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20  three variables 
26600 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64  above are zeroed
26610 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53  . In this case S
26620 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  QLite should.** 
26630 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69  continue accessi
26640 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
26650 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28  using the xRead(
26660 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a  ) and xWrite().*
26670 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  * methods..*/.st
26680 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65  atic void unixRe
26690 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46  mapfile(.  unixF
266a0 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20  ile *pFd,       
266b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
266c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62  le descriptor ob
266d0 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e  ject */.  i64 nN
266e0 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ew              
266f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
26700 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69  uired mapping si
26710 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ze */.){.  const
26720 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d   char *zErr = "m
26730 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20  map";.  int h = 
26740 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20  pFd->h;         
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26760 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
26770 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20  open on db file 
26780 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d  */.  u8 *pOrig =
26790 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70   (u8 *)pFd->pMap
267a0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69  Region;   /* Poi
267b0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
267c0 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  file mapping */.
267d0 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46    i64 nOrig = pF
267e0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
267f0 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
26800 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69  f pOrig region i
26810 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20  n bytes */.  u8 
26820 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20  *pNew = 0;      
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26840 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66    /* Location of
26850 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a   new mapping */.
26860 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52    int flags = PR
26870 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20  OT_READ;        
26880 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
26890 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28  to pass to mmap(
268a0 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ) */..  assert( 
268b0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
268c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
268d0 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  New>pFd->mmapSiz
268e0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
268f0 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  New<=pFd->mmapSi
26900 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72  zeMax );.  asser
26910 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61  t( nNew>0 );.  a
26920 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70  ssert( pFd->mmap
26930 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d  SizeActual>=pFd-
26940 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
26950 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45  ssert( MAP_FAILE
26960 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  D!=0 );..#ifdef 
26970 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
26980 57 52 49 54 45 0a 20 20 69 66 28 20 28 70 46 64  WRITE.  if( (pFd
26990 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
269a0 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
269b0 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f  0 ) flags |= PRO
269c0 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  T_WRITE;.#endif.
269d0 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a  .  if( pOrig ){.
269e0 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
269f0 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
26a00 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a   pFd->mmapSize;.
26a10 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
26a20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20  int szSyspage = 
26a30 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b  osGetpagesize();
26a40 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
26a50 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  = (pFd->mmapSize
26a60 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31   & ~(szSyspage-1
26a70 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75  ));.#endif.    u
26a80 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67  8 *pReq = &pOrig
26a90 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f  [nReuse];..    /
26aa0 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65  * Unmap any page
26ab0 73 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  s of the existin
26ac0 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63  g mapping that c
26ad0 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e  annot be reused.
26ae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75   */.    if( nReu
26af0 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20  se!=nOrig ){.   
26b00 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71     osMunmap(pReq
26b10 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b  , nOrig-nReuse);
26b20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45  .    }..#if HAVE
26b30 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77  _MREMAP.    pNew
26b40 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69   = osMremap(pOri
26b50 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c  g, nReuse, nNew,
26b60 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29   MREMAP_MAYMOVE)
26b70 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72  ;.    zErr = "mr
26b80 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20  emap";.#else.   
26b90 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70   pNew = osMmap(p
26ba0 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65  Req, nNew-nReuse
26bb0 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
26bc0 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b  RED, h, nReuse);
26bd0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d  .    if( pNew!=M
26be0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
26bf0 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65     if( pNew!=pRe
26c00 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  q ){.        osM
26c10 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77  unmap(pNew, nNew
26c20 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20   - nReuse);.    
26c30 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
26c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26c50 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b     pNew = pOrig;
26c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
26c70 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
26c80 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74  e attempt to ext
26c90 65 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  end the existing
26ca0 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e   mapping failed.
26cb0 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20   Free it. */.   
26cc0 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
26cd0 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30  AILED || pNew==0
26ce0 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
26cf0 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
26d00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26d10 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74  /* If pNew is st
26d20 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f  ill NULL, try to
26d30 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72   create an entir
26d40 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e  ely new mapping.
26d50 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
26d60 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
26d70 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20  osMmap(0, nNew, 
26d80 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45  flags, MAP_SHARE
26d90 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  D, h, 0);.  }.. 
26da0 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
26db0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65  AILED ){.    pNe
26dc0 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20  w = 0;.    nNew 
26dd0 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  = 0;.    unixLog
26de0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c  Error(SQLITE_OK,
26df0 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74   zErr, pFd->zPat
26e00 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  h);..    /* If t
26e10 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20  he mmap() above 
26e20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74  failed, assume t
26e30 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65  hat all subseque
26e40 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a  nt mmap() calls.
26e50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62      ** will prob
26e60 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46  ably fail too. F
26e70 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e  all back to usin
26e80 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65  g xRead/xWrite e
26e90 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a  xclusively.    *
26ea0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
26eb0 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   */.    pFd->mma
26ec0 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20  pSizeMax = 0;.  
26ed0 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  }.  pFd->pMapReg
26ee0 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e  ion = (void *)pN
26ef0 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ew;.  pFd->mmapS
26f00 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  ize = pFd->mmapS
26f10 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77  izeActual = nNew
26f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
26f30 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
26f40 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
26f50 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
26f60 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
26f70 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
26f80 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
26f90 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
26fa0 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
26fb0 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
26fc0 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
26fd0 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
26fe0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
26ff0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
27000 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
27010 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
27020 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
27030 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27040 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
27050 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
27060 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
27070 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
27080 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
27090 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
270a0 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
270b0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
270c0 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
270d0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
270e0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
270f0 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
27100 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
27110 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
27120 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
27130 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
27140 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
27150 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
27160 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
27170 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
27180 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49  TE_FCNTL_MMAP_LI
27190 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69  MIT, whichever i
271a0 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
271b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
271c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
271d0 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
271e0 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
271f0 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
27200 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
27210 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
27220 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
27230 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
27240 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
27250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27260 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
27270 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61  le *pFd, i64 nMa
27280 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  p){.  assert( nM
27290 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
272a0 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
272b0 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
272c0 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
272d0 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
272e0 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
272f0 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
27300 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
27310 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
27320 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74  nMap<0 ){.    st
27330 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
27340 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  f;          /* L
27350 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
27360 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
27370 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 64   if( osFstat(pFd
27380 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20 29  ->h, &statbuf) )
27390 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
273a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
273b0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  T;.    }.    nMa
273c0 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73  p = statbuf.st_s
273d0 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ize;.  }.  if( n
273e0 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
273f0 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
27400 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
27410 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Max;.  }..  asse
27420 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70  rt( nMap>0 || (p
27430 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20  Fd->mmapSize==0 
27440 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  && pFd->pMapRegi
27450 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  on==0) );.  if( 
27460 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
27470 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 52  ize ){.    unixR
27480 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d  emapfile(pFd, nM
27490 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ap);.  }..  retu
274a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
274b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
274c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
274d0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
274e0 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
274f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
27500 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
27510 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
27520 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
27530 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
27540 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
27550 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
27560 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
27570 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
27580 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
27590 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
275a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
275b0 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
275c0 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
275d0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
275e0 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
275f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
27600 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
27610 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
27620 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
27630 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
27640 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
27650 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
27660 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
27670 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
27680 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
27690 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
276a0 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
276b0 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
276c0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
276d0 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
276e0 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a  unixUnfetch()..*
276f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27700 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  xFetch(sqlite3_f
27710 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
27720 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
27730 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
27740 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
27750 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  E>0.  unixFile *
27760 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
27770 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
27780 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
27790 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  se file */.#endi
277a0 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69  f.  *pp = 0;..#i
277b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
277c0 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
277d0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
277e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
277f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
27800 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
27810 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
27820 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
27830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27840 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27850 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
27860 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
27870 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
27880 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
27890 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
278a0 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
278b0 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
278c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
278d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
278e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
278f0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
27900 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
27910 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27920 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
27930 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
27940 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
27950 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
27960 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
27970 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
27980 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
27990 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
279a0 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
279b0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
279c0 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
279d0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
279e0 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
279f0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
27a00 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
27a10 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
27a20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
27a30 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
27a40 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
27a50 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
27a60 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
27a70 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
27a80 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
27a90 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
27aa0 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
27ab0 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
27ac0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
27ad0 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
27ae0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
27af0 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
27b00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27b10 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
27b20 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
27b30 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
27b40 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
27b50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
27b60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27b70 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49  R(iOff);..  /* I
27b80 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
27b90 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
27ba0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
27bb0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
27bc0 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
27bd0 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
27be0 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
27bf0 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
27c00 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
27c10 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
27c20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
27c30 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
27c40 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
27c50 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
27c60 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
27c70 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
27c80 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
27c90 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
27ca0 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
27cb0 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
27cc0 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
27cd0 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
27ce0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
27cf0 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
27d00 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
27d10 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
27d20 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
27d30 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20  t>=0 );.#else.  
27d40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27d50 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
27d60 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
27d70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27d80 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  iOff);.#endif.  
27d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
27db0 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
27dc0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
27dd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
27de0 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
27df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
27e00 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
27e10 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
27e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e30 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
27e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e80 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
27e90 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
27ea0 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
27eb0 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
27ec0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
27ed0 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
27ee0 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
27ef0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
27f00 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
27f10 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
27f20 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
27f30 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
27f40 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
27f50 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
27f60 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
27f70 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
27f80 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
27f90 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
27fa0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
27fb0 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
27fc0 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
27fd0 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
27fe0 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
27ff0 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
28000 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
28010 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
28020 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
28030 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
28040 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
28050 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
28060 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
28070 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
28080 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
28090 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
280a0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
280b0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
280c0 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
280d0 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
280e0 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
280f0 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
28100 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
28110 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
28120 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
28130 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c  nder-function F,
28140 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
28150 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
28160 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
28170 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28180 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
28190 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
281a0 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
281b0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
281c0 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
281d0 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
281e0 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
281f0 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
28200 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
28210 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
28220 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
28230 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
28240 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
28250 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
28260 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
28270 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
28280 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
28290 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
282a0 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
282b0 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
282c0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
282d0 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
282e0 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
282f0 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
28300 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
28310 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
28320 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28330 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
28340 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
28350 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
28360 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
28370 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
28380 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
28390 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
283a0 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
283b0 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
283c0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
283d0 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
283e0 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
283f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
28400 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
28410 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
28420 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e  R,METHOD,VERSION
28430 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f  ,CLOSE,LOCK,UNLO
28440 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50  CK,CKLOCK,SHMMAP
28450 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63  )     \.static c
28460 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28470 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
28480 20 7b 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 20                  
284a0 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
284b0 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
284c0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
284d0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
28520 2f 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 20 20 20                  
28540 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
28550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28560 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
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 20 20 20 20                  
28590 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
285a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
285b0 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
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 20 20 20 20 20                  
285e0 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
285f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28600 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
28610 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
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 20 20 20 20 20 20 5c                 \
28680 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
28690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
286a0 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
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 20 20 20 20 20 20 5c 0a                \.
286d0 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
286f0 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28720 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28740 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28770 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28790 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
287a0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
287b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
287c0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
287d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
287e0 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28810 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
28820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28830 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28860 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
28870 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
28880 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
28890 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
288a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d          \.   SHM
288b0 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20  MAP,            
288c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
288d0 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28900 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
28910 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
28920 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28950 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
28960 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
28970 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28990 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
289a0 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
289b0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
289c0 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289e0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74      \.   unixFet
289f0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
28a00 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
28a10 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65     \.   unixUnfe
28a40 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
28a50 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
28a60 2a 2f 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 20 20 20 20                  
28a80 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
28ae0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28af0 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
28b00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
28b10 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
28b20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
28b30 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
28b40 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28b70 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
28b80 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28bc0 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
28c10 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
28c20 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
28c30 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
28c40 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
28c50 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
28c60 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
28c70 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
28c80 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
28c90 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28ca0 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
28cb0 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
28cc0 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
28cd0 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
28ce0 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
28cf0 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
28d00 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
28d10 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
28d20 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
28d30 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
28d40 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
28d50 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
28d60 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
28d70 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
28d80 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28d90 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
28dc0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
28dd0 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
28de0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
28df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28e00 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28e10 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
28e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28e30 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
28e40 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
28e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28e60 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
28e70 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
28e80 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
28e90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28ea0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
28eb0 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20  ixShmMap        
28ec0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
28ed0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
28ee0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
28ef0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
28f00 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
28f10 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
28f20 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
28f30 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
28f40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28f50 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
28f60 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
28f90 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
28fa0 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
28fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28fc0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
28fd0 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
28fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
28ff0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
29000 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
29010 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29020 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29030 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
29040 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68  vedLock,  /* xCh
29050 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29060 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29090 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
290a0 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
290b0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
290c0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
290d0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
290e0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
290f0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
29100 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29110 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29120 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29140 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29150 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
29160 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
29170 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29180 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
29190 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
291a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
291b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
291c0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
291d0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
291e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
291f0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
29200 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63  edLock, /* xChec
29210 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29220 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29240 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
29250 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
29260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29270 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29280 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
29290 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
292a0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
292b0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
292c0 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
292d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
292e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
292f0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29300 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29320 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29330 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
29340 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
29350 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29360 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
29370 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
29380 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29390 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
293a0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
293b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
293c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
293d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
293e0 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
293f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29400 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29430 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29440 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
29450 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
29460 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
29470 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29480 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29490 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
294a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
294b0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
294c0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
294d0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29500 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29510 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20    semXClose,    
29520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29530 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29540 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20    semXLock,     
29550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29560 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29570 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20   semXUnlock,    
29580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29590 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
295a0 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72    semXCheckReser
295b0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
295c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
295d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
295e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29600 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
29610 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
29620 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29630 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29640 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
29650 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46  ETHODS(.  afpIoF
29660 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29670 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29680 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29690 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20   afpIoMethods,  
296a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
296b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
296c0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
296d0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
296e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
296f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29700 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66  disabled */.  af
29710 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  pClose,         
29720 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29730 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  e method */.  af
29740 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  pLock,          
29750 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29760 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
29770 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29780 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29790 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
297a0 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
297b0 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
297c0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
297d0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
29800 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
29810 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
29820 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
29830 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
29840 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
29850 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
29860 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
29870 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
29880 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
29890 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
298a0 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
298b0 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
298c0 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
298d0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
298e0 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
298f0 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
29900 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
29910 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
29920 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
29930 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
29940 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
29950 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
29960 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
29970 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
29980 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
29990 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
299a0 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
299b0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
299c0 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
299d0 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
299e0 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
299f0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
29a00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29a10 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
29a20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29a30 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
29a40 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
29a50 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
29a60 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
29a70 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
29a80 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
29a90 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
29aa0 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
29ab0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
29ac0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
29ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
29ae0 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
29af0 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
29b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29b10 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29b20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
29b30 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29b40 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29b50 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29b60 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29b90 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29ba0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
29bb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29bc0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29bd0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
29be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bf0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
29c00 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
29c10 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29c20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
29c30 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
29c40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
29c50 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29c60 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29c70 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c90 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
29ca0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
29cb0 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
29cc0 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
29cd0 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
29ce0 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
29cf0 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
29d00 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29d10 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
29d20 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29d30 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
29d40 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
29d50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29d60 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29d70 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
29d80 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
29d90 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29da0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29db0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
29de0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
29df0 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e10 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29e20 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e40 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
29e50 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
29e80 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
29e90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
29ea0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
29eb0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
29ec0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
29ef0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
29f00 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
29f10 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29f20 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29f30 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
29f40 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
29f50 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
29f60 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
29f70 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
29f80 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
29f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
29fa0 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
29fb0 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
29fc0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29fd0 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
29fe0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
29ff0 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
2a000 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f  This is for MacO
2a010 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  SX only..*/.stat
2a020 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a030 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
2a040 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2a050 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2a060 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2a070 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2a080 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2a090 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2a0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e           /* open
2a0b0 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72   file object for
2a0c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a0d0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
2a0e0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
2a0f0 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
2a100 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
2a110 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
2a120 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
2a130 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
2a140 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2a150 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
2a160 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
2a170 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
2a180 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
2a190 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
2a1a0 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2a1b0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2a1c0 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
2a1d0 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
2a1e0 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
2a1f0 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2a200 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26     { "smbfs",  &
2a210 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
2a220 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20      { "webdav", 
2a230 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2a240 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d   },.    { 0, 0 }
2a250 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
2a260 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2a270 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  sInfo;.  struct 
2a280 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2a290 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2a2a0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2a2b0 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2a2c0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2a2d0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2a2e0 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2a2f0 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2a300 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2a310 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2a320 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2a330 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ods;.  }.  if( s
2a340 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20  tatfs(filePath, 
2a350 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29  &fsInfo) != -1 )
2a360 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f  {.    if( fsInfo
2a370 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
2a380 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72  DONLY ){.      r
2a390 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2a3a0 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2a3b0 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b    for(i=0; aMap[
2a3c0 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  i].zFilesystem; 
2a3d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2a3e0 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2a3f0 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70  fstypename, aMap
2a400 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29  [i].zFilesystem)
2a410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2a420 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d  eturn aMap[i].pM
2a430 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a  ethods;.      }.
2a440 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a450 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61  Default case. Ha
2a460 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f  ndles, amongst o
2a470 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20  thers, "nfs"..  
2a480 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e  ** Test byte-ran
2a490 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63  ge lock using fc
2a4a0 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61  ntl(). If the ca
2a4b0 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20  ll succeeds, .  
2a4c0 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
2a4d0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2a4e0 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74  upports POSIX st
2a4f0 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f  yle locks. .  */
2a500 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
2a510 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
2a520 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
2a530 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
2a540 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
2a550 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
2a560 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
2a570 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
2a580 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
2a590 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
2a5a0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
2a5b0 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2a5c0 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a  e, "nfs")==0 ){.
2a5d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66        return &nf
2a5e0 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  sIoMethods;.    
2a5f0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
2a600 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2a610 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  thods;.    }.  }
2a620 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2a630 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2a640 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2a650 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a660 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2a670 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2a680 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2a690 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2a6a0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2a6b0 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2a6c0 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
2a6d0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2a6e0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a6f0 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56  YLE */..#if OS_V
2a700 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69  XWORKS./*.** Thi
2a710 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2a720 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20  ion for VxWorks 
2a730 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
2a740 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a   posix advisory.
2a750 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  ** locking works
2a760 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  .  If it does, t
2a770 68 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74  hen that is what
2a780 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74   is used.  If it
2a790 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72   does not.** wor
2a7a0 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b  k, then fallback
2a7b0 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68   to named semaph
2a7c0 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ore locking..*/.
2a7d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2a7e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a7f0 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72  *vxworksIoFinder
2a800 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2a810 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2a820 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2a830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2a840 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2a850 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
2a860 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
2a870 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2a880 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2a890 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2a8a0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2a8b0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2a8c0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2a8d0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2a8e0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2a8f0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2a900 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a910 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2a920 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2a930 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
2a940 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
2a950 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
2a960 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
2a970 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
2a980 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
2a990 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
2a9a0 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
2a9b0 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
2a9c0 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2a9d0 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2a9e0 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2a9f0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2aa00 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2aa10 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2aa20 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2aa30 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2aa40 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2aa50 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
2aa60 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2aa70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2aa80 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
2aa90 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2aaa0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2aab0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2aac0 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46  const vxworksIoF
2aad0 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2aae0 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2aaf0 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2ab00 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
2ab10 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f  OS_VXWORKS */../
2ab20 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
2ab30 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
2ab40 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74  ter to an IO met
2ab50 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
2ab60 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
2ab70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2ab80 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
2ab90 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
2aba0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
2abb0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac00 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2ac10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
2ac20 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
2ac30 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2ac50 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
2ac60 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
2ac70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2ac80 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
2ac90 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
2aca0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
2acb0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2acc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2acd0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2ace0 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
2acf0 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
2ad00 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
2ad10 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
2ad20 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
2ad30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
2ad40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2ad50 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
2ad60 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
2ad70 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
2ad80 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2ad90 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2ada0 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
2adb0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
2adc0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2add0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2ade0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2adf0 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
2ae00 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2ae10 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74  ened */.  int ct
2ae20 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
2ae30 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
2ae40 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c  e UNIXFILE_* val
2ae50 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ues */.){.  cons
2ae60 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2ae70 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
2ae80 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
2ae90 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
2aea0 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
2aeb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2aec0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2aed0 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
2aee0 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68  .  /* Usually th
2aef0 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65  e path zFilename
2af00 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
2af10 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
2af20 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63  me. The.  ** exc
2af30 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f  eption is when o
2af40 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79  pening the proxy
2af50 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e   "conch" file in
2af60 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a   builds that.  *
2af70 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70  * include the sp
2af80 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b  ecial Apple lock
2af90 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f  ing styles..  */
2afa0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2afb0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2afc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2afd0 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28  _STYLE.  assert(
2afe0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
2aff0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
2b000 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d  /' .    || pVfs-
2b010 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64  >pAppData==(void
2b020 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
2b030 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61  der );.#else.  a
2b040 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2b050 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
2b060 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64  [0]=='/' );.#end
2b070 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b  if..  /* No lock
2b080 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65  ing occurs in te
2b090 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
2b0a0 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
2b0b0 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c  name!=0 || (ctrl
2b0c0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2b0d0 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a  _NOLOCK)!=0 );..
2b0e0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
2b0f0 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
2b100 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
2b110 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
2b120 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56   pNew->pVfs = pV
2b130 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74  fs;.  pNew->zPat
2b140 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2b150 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b160 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73   = (u8)ctrlFlags
2b170 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
2b180 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
2b190 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  New->mmapSizeMax
2b1a0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
2b1b0 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23  Config.szMmap;.#
2b1c0 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
2b1d0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2b1e0 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
2b1f0 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
2b200 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b220 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
2b230 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
2b240 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
2b250 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2b260 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2b270 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
2b280 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  strcmp(pVfs->zNa
2b290 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d  me,"unix-excl")=
2b2a0 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
2b2b0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2b2c0 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a  XFILE_EXCL;.  }.
2b2d0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2b2e0 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
2b2f0 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
2b300 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2b310 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
2b320 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20  {.    ctrlFlags 
2b330 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
2b340 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  CK;.    rc = SQL
2b350 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
2b360 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72  endif..  if( ctr
2b370 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2b380 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
2b390 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2b3a0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2b3b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2b3c0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2b3d0 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2b3e0 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2b3f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2b400 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2b410 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b420 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2b430 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2b440 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2b450 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2b460 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2b470 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2b480 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2b490 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2b4a0 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2b4b0 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2b4c0 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2b4d0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2b4e0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2b4f0 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2b500 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2b510 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2b520 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2b530 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2b540 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2b550 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2b560 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b570 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2b580 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b590 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2b5a0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2b5b0 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2b5c0 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
2b5d0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2b5e0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2b5f0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2b600 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2b610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b620 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
2b630 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2b640 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
2b650 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
2b660 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
2b670 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
2b680 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
2b690 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
2b6a0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
2b6b0 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
2b6c0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
2b6d0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
2b6e0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
2b6f0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
2b700 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
2b710 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
2b720 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
2b730 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
2b740 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
2b750 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
2b760 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
2b770 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
2b780 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2b790 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2b7a0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2b7b0 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
2b7c0 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
2b7d0 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
2b7e0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
2b7f0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
2b800 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2b810 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
2b820 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2b830 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
2b840 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
2b850 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
2b860 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
2b870 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
2b880 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
2b890 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
2b8a0 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
2b8b0 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
2b8c0 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
2b8d0 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
2b8e0 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
2b8f0 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
2b900 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
2b910 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
2b920 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
2b930 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
2b940 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
2b950 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
2b960 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
2b970 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
2b980 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
2b990 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
2b9a0 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
2b9b0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2b9c0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2b9d0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
2b9e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2b9f0 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
2ba00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ba10 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2ba20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2ba30 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2ba40 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
2ba50 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2ba60 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
2ba70 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2ba80 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2ba90 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2baa0 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
2bab0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
2bac0 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
2bad0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2bae0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
2baf0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
2bb00 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2bb10 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
2bb20 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
2bb30 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
2bb40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2bb50 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2bb60 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
2bb70 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
2bb80 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2bb90 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
2bba0 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
2bbb0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
2bbc0 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
2bbd0 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
2bbe0 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
2bbf0 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
2bc00 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
2bc10 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
2bc20 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2bc30 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
2bc40 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
2bc50 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
2bc60 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2bc70 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
2bc80 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2bc90 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2bca0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
2bcb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bcc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2bcd0 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
2bce0 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
2bcf0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2bd00 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2bd10 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
2bd20 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
2bd30 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2bd40 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
2bd50 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2bd60 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2bd70 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
2bd80 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
2bd90 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
2bda0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2bdb0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2bdc0 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2bdd0 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2bde0 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
2bdf0 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
2be00 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
2be10 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
2be20 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
2be30 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2be40 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
2be50 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
2be60 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
2be70 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
2be80 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2be90 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e  _malloc64(nFilen
2bea0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
2beb0 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
2bec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bed0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2bee0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2bef0 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2bf00 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2bf10 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2bf20 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2bf30 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2bf40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2bf50 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2bf60 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2bf70 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2bf80 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2bf90 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2bfa0 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2bfb0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2bfc0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2bfd0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2bfe0 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2bff0 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2c000 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2c010 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2c020 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2c030 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2c040 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2c050 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2c060 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2c070 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2c080 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2c090 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2c0a0 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2c0b0 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2c0c0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2c0d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c0e0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2c0f0 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2c100 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c110 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c120 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2c130 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2c140 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2c150 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2c160 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2c170 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2c180 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2c190 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2c1a0 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2c1b0 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2c1c0 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2c1d0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2c1e0 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2c1f0 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2c200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2c210 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
2c220 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2c230 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2c240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c250 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2c260 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2c270 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  .  storeLastErrn
2c280 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20  o(pNew, 0);.#if 
2c290 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
2c2a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c2b0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2c2c0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2c2d0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2c2e0 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
2c2f0 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
2c300 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
2c310 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2c320 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2c330 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2c340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c350 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2c360 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2c370 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2c380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
2c390 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
2c3a0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
2c3b0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
2c3c0 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
2c3d0 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
2c3e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c3f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2c400 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
2c410 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
2c420 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
2c430 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
2c440 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
2c450 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
2c460 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
2c470 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2c480 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2c490 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2c4a0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2c4b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
2c4c0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
2c4d0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
2c4e0 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
2c4f0 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
2c500 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
2c510 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
2c520 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2c530 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2c540 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2c550 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2c560 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21  ectory;..  if( !
2c570 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
2c580 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
2c590 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
2c5a0 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
2c5b0 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
2c5c0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
2c5d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
2c5e0 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
2c5f0 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
2c600 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
2c610 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  ]){.    if( zDir
2c620 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2c630 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a      if( osStat(z
2c640 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  Dir, &buf) ) con
2c650 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
2c660 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
2c670 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
2c680 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73  .    if( osAcces
2c690 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f  s(zDir, 07) ) co
2c6a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61  ntinue;.    brea
2c6b0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2c6c0 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zDir;.}../*.** C
2c6d0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2c6e0 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
2c6f0 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
2c700 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
2c710 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
2c720 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
2c730 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
2c740 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
2c750 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
2c760 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
2c770 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
2c780 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
2c790 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2c7a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2c7b0 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  r;.  int iLimit 
2c7c0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  = 0;..  /* It's 
2c7d0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2c7e0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2c7f0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2c800 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2c810 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2c820 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2c830 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2c840 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2c850 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2c860 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
2c870 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2c880 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2c890 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
2c8a0 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
2c8b0 69 72 28 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ir();.  do{.    
2c8c0 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  u64 r;.    sqlit
2c8d0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
2c8e0 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
2c8f0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32    assert( nBuf>2
2c900 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75   );.    zBuf[nBu
2c910 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  f-2] = 0;.    sq
2c920 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2c930 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  Buf, zBuf, "%s/"
2c940 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2c950 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c  _PREFIX"%llx%c",
2c960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c970 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30        zDir, r, 0
2c980 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b  );.    if( zBuf[
2c990 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69  nBuf-2]!=0 || (i
2c9a0 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65  Limit++)>10 ) re
2c9b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2c9c0 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  R;.  }while( osA
2c9d0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
2c9e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2c9f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
2ca00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ca10 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2ca20 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2ca30 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
2ca40 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
2ca50 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
2ca60 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
2ca70 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
2ca80 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
2ca90 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
2caa0 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
2cab0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
2cac0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2cad0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
2cae0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2caf0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
2cb00 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
2cb10 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
2cb20 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
2cb30 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
2cb40 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2cb50 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
2cb60 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
2cb70 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
2cb80 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
2cb90 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
2cba0 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
2cbb0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
2cbc0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
2cbd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
2cbe0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
2cbf0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
2cc00 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
2cc10 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2cc20 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
2cc30 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
2cc40 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
2cc50 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2cc60 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
2cc70 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
2cc80 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
2cc90 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
2cca0 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
2ccb0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
2ccc0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
2ccd0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
2cce0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
2ccf0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
2cd00 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
2cd10 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
2cd20 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
2cd30 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
2cd40 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
2cd50 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
2cd60 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
2cd70 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2cd80 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
2cd90 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
2cda0 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
2cdb0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
2cdc0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
2cdd0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
2cde0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
2cdf0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
2ce00 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
2ce10 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
2ce20 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
2ce30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
2ce40 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
2ce50 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
2ce60 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
2ce70 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
2ce80 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2ce90 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
2cea0 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
2ceb0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2cec0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
2ced0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
2cee0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
2cef0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
2cf00 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
2cf10 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
2cf20 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
2cf30 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
2cf40 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
2cf50 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
2cf60 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
2cf70 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
2cf80 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
2cf90 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
2cfa0 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
2cfb0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
2cfc0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
2cfd0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
2cfe0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
2cff0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2d000 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2d010 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
2d020 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
2d030 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
2d040 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
2d050 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
2d060 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
2d070 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
2d080 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
2d090 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
2d0a0 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
2d0b0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
2d0c0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
2d0d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2d0e0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
2d0f0 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
2d100 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
2d110 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2d120 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2d130 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
2d140 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
2d150 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
2d160 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
2d170 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
2d180 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
2d190 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
2d1a0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
2d1b0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
2d1c0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
2d1d0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
2d1e0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
2d1f0 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69  or a reusable fi
2d200 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
2d210 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
2d220 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2d230 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
2d240 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
2d250 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
2d260 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2d270 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  ();.    pInode =
2d280 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
2d290 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
2d2a0 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
2d2b0 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
2d2c0 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
2d2d0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
2d2e0 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  e->fileId.ino!=s
2d2f0 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
2d300 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
2d310 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
2d320 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
2d330 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
2d340 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
2d350 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
2d360 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
2d370 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
2d380 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
2d390 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
2d3a0 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
2d3b0 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
2d3c0 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
2d3d0 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
2d3e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
2d3f0 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2d400 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2d410 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
2d420 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
2d430 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
2d440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2d450 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2d460 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
2d470 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2d480 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
2d490 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
2d4a0 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
2d4b0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2d4c0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2d4d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
2d4e0 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
2d4f0 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
2d500 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
2d510 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
2d520 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
2d530 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
2d540 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2d550 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
2d560 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
2d570 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2d580 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
2d590 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
2d5a0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
2d5b0 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2d5c0 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2d5d0 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2d5e0 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2d5f0 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2d600 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2d610 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2d620 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2d630 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2d640 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2d650 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2d660 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2d670 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2d680 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2d690 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2d6a0 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2d6b0 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2d6c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2d6d0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2d6e0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2d6f0 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2d700 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2d710 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2d720 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2d730 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2d740 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2d750 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2d760 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2d770 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2d780 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2d790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2d7a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2d7b0 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2d7c0 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2d7d0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2d7e0 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2d7f0 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2d800 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2d810 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2d820 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2d830 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2d840 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2d850 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2d860 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2d870 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2d880 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2d890 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2d8a0 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2d8b0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2d8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2d8d0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2d8e0 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2d8f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2d900 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2d910 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2d920 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2d930 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2d940 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2d950 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2d960 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d970 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2d980 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2d990 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9b0 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2d9c0 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2d9d0 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2d9e0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2d9f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2da00 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2da10 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2da20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2da30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2da40 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2da50 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2da60 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2da70 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2da80 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2da90 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2daa0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2dab0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2dac0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2dad0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2dae0 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2daf0 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2db20 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2db30 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
2db40 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2db50 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2db60 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2db70 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2db80 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2db90 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2dba0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2dbb0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2dbc0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2dbd0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2dbe0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2dbf0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2dc00 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2dc10 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2dc20 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2dc30 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2dc40 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2dc50 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2dc60 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2dc70 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2dc80 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2dc90 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2dca0 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
2dcb0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2dcc0 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
2dcd0 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
2dce0 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
2dcf0 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
2dd00 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
2dd10 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
2dd20 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
2dd30 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
2dd40 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
2dd50 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2dd60 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c  ) - 1; .    whil
2dd70 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  e( zPath[nDb]!='
2dd80 2d 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  -' ){.#ifndef SQ
2dd90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2dda0 4e 41 4d 45 53 0a 20 20 20 20 20 20 2f 2a 20 49  NAMES.      /* I
2ddb0 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73  n the normal cas
2ddc0 65 20 28 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  e (8+3 filenames
2ddd0 20 64 69 73 61 62 6c 65 64 29 20 74 68 65 20 6a   disabled) the j
2dde0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2ddf0 20 20 20 20 20 20 2a 2a 20 69 73 20 67 75 61 72        ** is guar
2de00 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61 69  anteed to contai
2de10 6e 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65  n a '-' characte
2de20 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
2de30 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20  rt( nDb>0 );.   
2de40 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2de50 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
2de60 6e 44 62 5d 29 20 29 3b 0a 23 65 6c 73 65 0a 20  nDb]) );.#else. 
2de70 20 20 20 20 20 2f 2a 20 49 66 20 38 2b 33 20 6e       /* If 8+3 n
2de80 61 6d 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  ames are possibl
2de90 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
2dea0 6e 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  nal file might n
2deb0 6f 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  ot contain.     
2dec0 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63   ** a '-' charac
2ded0 74 65 72 2e 20 20 53 6f 20 63 68 65 63 6b 20 66  ter.  So check f
2dee0 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 64  or that case and
2def0 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
2df00 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62 3d  /.      if( nDb=
2df10 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
2df20 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20 53  =='.' ) return S
2df30 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
2df40 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
2df50 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a    }.    memcpy(z
2df60 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
2df70 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
2df80 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
2df90 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73  ==osStat(zDb, &s
2dfa0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
2dfb0 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
2dfc0 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
2dfd0 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
2dfe0 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20  t.st_uid;.      
2dff0 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
2e000 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _gid;.    }else{
2e010 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2e020 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
2e030 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2e040 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2e050 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2e060 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
2e070 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
2e080 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e090 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
2e0a0 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
2e0b0 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
2e0c0 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
2e0d0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
2e0e0 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
2e0f0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
2e100 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2e110 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
2e120 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2e130 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
2e140 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
2e150 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2e160 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
2e170 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
2e180 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2e190 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
2e1a0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2e1b0 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
2e1c0 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
2e1d0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
2e1e0 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
2e1f0 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
2e200 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
2e210 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
2e220 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
2e230 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
2e240 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
2e250 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
2e260 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
2e270 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
2e280 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
2e290 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
2e2a0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
2e2b0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2e2c0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
2e2d0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
2e2e0 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
2e2f0 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
2e300 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
2e310 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
2e320 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
2e330 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
2e340 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
2e350 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
2e360 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
2e370 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
2e380 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2e390 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
2e3a0 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
2e3b0 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
2e3c0 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
2e3d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2e3e0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
2e3f0 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
2e400 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
2e410 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
2e420 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
2e430 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
2e440 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
2e450 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
2e460 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2e470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2e480 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
2e490 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
2e4a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
2e4b0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
2e4c0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
2e4d0 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
2e4e0 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
2e4f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
2e500 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
2e510 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
2e520 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2e530 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2e540 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
2e550 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
2e560 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
2e570 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2e580 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
2e590 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
2e5a0 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
2e5b0 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
2e5c0 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
2e5d0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
2e5e0 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
2e5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e600 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
2e610 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
2e620 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2e630 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2e640 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
2e650 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
2e660 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  t ctrlFlags = 0;
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e680 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73  UNIXFILE_* flags
2e690 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
2e6a0 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
2e6b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
2e6c0 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
2e6d0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
2e6e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e6f0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2e700 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
2e710 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
2e720 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
2e730 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
2e740 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
2e750 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e760 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
2e770 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
2e780 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e790 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2e7a0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
2e7b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2e7c0 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
2e7d0 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
2e7e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
2e7f0 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
2e800 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2e810 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
2e820 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e830 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
2e840 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65  tatfs fsInfo;.#e
2e850 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
2e860 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
2e870 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
2e880 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
2e890 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
2e8a0 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
2e8b0 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
2e8c0 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
2e8d0 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
2e8e0 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
2e8f0 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
2e900 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2e910 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
2e920 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
2e930 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ..  */.  int syn
2e940 63 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65  cDir = (isCreate
2e950 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
2e960 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2e970 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2e980 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
2e990 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2e9a0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2e9b0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e9c0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a  OPEN_WAL.  ));..
2e9d0 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
2e9e0 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
2e9f0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2ea00 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
2ea10 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
2ea20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2ea30 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
2ea40 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
2ea50 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
2ea60 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
2ea70 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
2ea80 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  2];.  const char
2ea90 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
2eaa0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
2eab0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
2eac0 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
2ead0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
2eae0 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
2eaf0 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
2eb00 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
2eb10 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
2eb20 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
2eb30 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
2eb40 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
2eb50 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
2eb60 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
2eb70 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
2eb80 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
2eb90 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2eba0 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
2ebb0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
2ebc0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2ebd0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2ebe0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
2ebf0 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
2ec00 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2ec10 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
2ec20 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
2ec30 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
2ec40 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
2ec50 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
2ec60 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
2ec70 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2ec80 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
2ec90 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
2eca0 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
2ecb0 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
2ecc0 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
2ecd0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
2ece0 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
2ecf0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2ed00 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
2ed10 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
2ed20 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
2ed30 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2ed40 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2ed50 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2ed60 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
2ed70 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2ed80 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2ed90 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2eda0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2edb0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2edc0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2edd0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2ede0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2edf0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2ee00 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2ee10 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2ee20 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2ee30 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
2ee40 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
2ee50 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
2ee60 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
2ee70 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
2ee80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
2ee90 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2eea0 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
2eeb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2eec0 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
2eed0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2eee0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2eef0 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
2ef00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2ef10 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2ef20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ef30 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2ef40 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
2ef50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2ef60 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
2ef70 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ef80 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
2ef90 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
2efa0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
2efb0 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74 20  );..  /* Detect 
2efc0 61 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e 64  a pid change and
2efd0 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
2efe0 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61 63    There is a rac
2eff0 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a  e condition.  **
2f000 20 68 65 72 65 20 73 75 63 68 20 74 68 61 74 20   here such that 
2f010 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65  two or more thre
2f020 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20 74  ads all trying t
2f030 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 73  o open databases
2f040 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d   at.  ** the sam
2f050 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74 20  e instant might 
2f060 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50 52  all reset the PR
2f070 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70 6c  NG.  But multipl
2f080 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61 72  e resets.  ** ar
2f090 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  e harmless..  */
2f0a0 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73  .  if( randomnes
2f0b0 73 50 69 64 21 3d 6f 73 47 65 74 70 69 64 28 30  sPid!=osGetpid(0
2f0c0 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e  ) ){.    randomn
2f0d0 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69  essPid = osGetpi
2f0e0 64 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d(0);.    sqlite
2f0f0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
2f100 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74  );.  }..  memset
2f110 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
2f120 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
2f130 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f140 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
2f150 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
2f160 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
2f170 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
2f180 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
2f190 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
2f1a0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
2f1b0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
2f1c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f1d0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
2f1e0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
2f1f0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
2f200 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73        if( !pUnus
2f210 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
2f220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f230 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
2f240 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20  .    p->pUnused 
2f250 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20  = pUnused;..    
2f260 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2f270 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
2f280 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
2f290 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
2f2a0 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74  .    ** URIs wit
2f2b0 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
2f2c0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
2f2d0 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
2f2e0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  into.    ** sqli
2f2f0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2f300 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2f310 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  rt( (flags & SQL
2f320 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
2f330 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
2f340 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
2f350 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
2f360 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
2f370 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
2f380 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
2f390 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
2f3a0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
2f3b0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
2f3c0 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20  && !syncDir);.  
2f3d0 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65    rc = unixGetTe
2f3e0 6d 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50  mpname(pVfs->mxP
2f3f0 61 74 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d  athname, zTmpnam
2f400 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2f410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f420 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f430 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
2f440 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f  zTmpname;..    /
2f450 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70  * Generated temp
2f460 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20  orary filenames 
2f470 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c  are always doubl
2f480 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
2f490 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65  d.    ** for use
2f4a0 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   by sqlite3_uri_
2f4b0 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2f4c0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
2f4d0 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  e[strlen(zName)+
2f4e0 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  1]==0 );.  }..  
2f4f0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
2f500 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
2f510 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
2f520 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
2f530 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
2f540 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
2f550 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
2f560 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
2f570 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
2f580 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
2f590 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
2f5a0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
2f5b0 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
2f5c0 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
2f5d0 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
2f5e0 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
2f5f0 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
2f600 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
2f610 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
2f620 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
2f630 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
2f640 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
2f650 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
2f660 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
2f670 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
2f680 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
2f690 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
2f6a0 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
2f6b0 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
2f6c0 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
2f6d0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2f6e0 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
2f6f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2f700 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
2f710 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
2f720 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20  th */.    uid_t 
2f730 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  uid;            
2f740 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69          /* Useri
2f750 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
2f760 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b  /.    gid_t gid;
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f780 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66      /* Groupid f
2f790 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  or the file */. 
2f7a0 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61     rc = findCrea
2f7b0 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65  teFileMode(zName
2f7c0 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f  , flags, &openMo
2f7d0 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b  de, &uid, &gid);
2f7e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f800 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75  assert( !p->pUnu
2f810 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  sed );.      ass
2f820 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
2f830 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65  TE_OPEN_WAL || e
2f840 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f850 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
2f860 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2f870 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20  c;.    }.    fd 
2f880 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
2f890 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
2f8a0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f  openMode);.    O
2f8b0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20  STRACE(("OPENX  
2f8c0 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c   %-3d %s 0%o\n",
2f8d0 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e   fd, zName, open
2f8e0 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73  Flags));.    ass
2f8f0 65 72 74 28 20 21 69 73 45 78 63 6c 75 73 69 76  ert( !isExclusiv
2f900 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20  e || (openFlags 
2f910 26 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b  & O_CREAT)!=0 );
2f920 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
2f930 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26   errno!=EISDIR &
2f940 26 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  & isReadWrite ){
2f950 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64  .      /* Failed
2f960 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
2f970 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  e for read/write
2f980 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61   access. Try rea
2f990 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  d-only. */.     
2f9a0 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
2f9b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2f9c0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
2f9d0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65  EATE);.      ope
2f9e0 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44  nFlags &= ~(O_RD
2f9f0 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20  WR|O_CREAT);.   
2fa00 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
2fa10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2fa20 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
2fa30 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
2fa40 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
2fa50 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20  = 1;.      fd = 
2fa60 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
2fa70 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
2fa80 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  enMode);.    }. 
2fa90 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
2faa0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2fab0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2fac0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
2fad0 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
2fae0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2faf0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ished;.    }..  
2fb00 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
2fb10 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
2fb20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63  as root and if c
2fb30 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f  reating a new ro
2fb40 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f  llback.    ** jo
2fb50 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c  urnal or WAL fil
2fb60 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72  e, set the owner
2fb70 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72  ship of the jour
2fb80 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65  nal or WAL to be
2fb90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
2fba0 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
2fbb0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
2fbc0 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  /.    if( flags 
2fbd0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
2fbe0 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
2fbf0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
2fc00 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f        robustFcho
2fc10 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29  wn(fd, uid, gid)
2fc20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
2fc30 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20  sert( fd>=0 );. 
2fc40 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
2fc50 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73  {.    *pOutFlags
2fc60 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
2fc70 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20   if( p->pUnused 
2fc80 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  ){.    p->pUnuse
2fc90 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
2fca0 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  p->pUnused->flag
2fcb0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
2fcc0 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
2fcd0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2fce0 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
2fcf0 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  me;.#elif define
2fd00 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f  d(SQLITE_UNLINK_
2fd10 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20  AFTER_CLOSE).   
2fd20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33   zPath = sqlite3
2fd30 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
2fd40 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
2fd50 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Path==0 ){.     
2fd60 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
2fd70 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
2fd80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fd90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2fda0 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c  .#else.    osUnl
2fdb0 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64  ink(zName);.#end
2fdc0 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  if.  }.#if SQLIT
2fdd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2fde0 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20  _STYLE.  else{. 
2fdf0 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20     p->openFlags 
2fe00 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d  = openFlags;.  }
2fe10 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63  .#endif..  noLoc
2fe20 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
2fe30 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
2fe40 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
2fe50 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
2fe60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2fe70 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20  ING_STYLE.  if( 
2fe80 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49  fstatfs(fd, &fsI
2fe90 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2fea0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2feb0 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  (p, errno);.    
2fec0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2fed0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2fee0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fef0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2ff00 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
2ff10 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
2ff20 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2ff30 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
2ff40 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
2ff50 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
2ff60 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
2ff70 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  SDOS;.  }.  if (
2ff80 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78  0 == strncmp("ex
2ff90 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  fat", fsInfo.f_f
2ffa0 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
2ffb0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2ffc0 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
2ffd0 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
2ffe0 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
2fff0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
30000 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65  t up appropriate
30010 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20   ctrlFlags */.  
30020 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20  if( isDelete )  
30030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
30040 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
30050 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66  ILE_DELETE;.  if
30060 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
30070 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
30080 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
30090 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  E_RDONLY;.  if( 
300a0 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20  noLock )        
300b0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
300c0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
300d0 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79  NOLOCK;.  if( sy
300e0 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20 20  ncDir )         
300f0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
30100 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49  s |= UNIXFILE_DI
30110 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61  RSYNC;.  if( fla
30120 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
30130 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73  _URI ) ctrlFlags
30140 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49   |= UNIXFILE_URI
30150 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
30160 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
30170 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52  LE.#if SQLITE_PR
30180 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
30190 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79  NG.  isAutoProxy
301a0 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 1;.#endif.  i
301b0 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26  f( isAutoProxy &
301c0 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20  & (zPath!=NULL) 
301d0 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20  && (!noLock) && 
301e0 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20  pVfs->xOpen ){. 
301f0 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63     char *envforc
30200 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
30210 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
30220 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e  OCKING");.    in
30230 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a  t useProxy = 0;.
30240 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
30250 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
30260 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63  NG==1 means forc
30270 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f  e always use pro
30280 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20  xy, 0 means .   
30290 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72   ** never use pr
302a0 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  oxy, NULL means 
302b0 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f  use proxy for no
302c0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e  n-local files on
302d0 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ly.  */.    if( 
302e0 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29  envforce!=NULL )
302f0 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
30300 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65   = atoi(envforce
30310 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )>0;.    }else{.
30320 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
30330 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
30340 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
30350 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
30360 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
30370 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
30380 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
30390 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
303a0 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
303b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
303c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
303d0 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
303e0 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  File((unixFile*)
303f0 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29  pFile, ":auto:")
30400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30420 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
30430 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65  unixClose to cle
30440 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72  an up the resour
30450 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c  ces added in fil
30460 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20  lInUnixFile .   
30470 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c         ** and cl
30480 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75  ear all the stru
30490 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63  cture's referenc
304a0 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  es.  Specificall
304b0 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y, .          **
304c0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
304d0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f   will be NULL so
304e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20   sqlite3OsClose 
304f0 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20  will be a no-op 
30500 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30510 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73          unixClos
30520 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
30530 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30550 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
30560 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
30570 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
30580 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
30590 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70  File(pVfs, fd, p
305a0 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72  File, zPath, ctr
305b0 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66  lFlags);..open_f
305c0 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72  inished:.  if( r
305d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
305e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
305f0 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  (p->pUnused);.  
30600 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
30610 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
30620 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74  the file at zPat
30630 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e  h. If the dirSyn
30640 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  c argument is tr
30650 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74  ue, fsync().** t
30660 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  he directory aft
30670 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
30680 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
30690 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a  int unixDelete(.
306a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
306b0 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56  otUsed,     /* V
306c0 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
306d0 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74  is as the xDelet
306e0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  e method */.  co
306f0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
30700 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
30710 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  of file to be de
30720 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  leted */.  int d
30730 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  irSync          
30740 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
30750 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f   fsync() directo
30760 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
30770 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  g file */.){.  i
30780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30790 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  K;.  UNUSED_PARA
307a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
307b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
307c0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
307d0 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
307e0 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50   if( osUnlink(zP
307f0 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ath)==(-1) ){.  
30800 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f    if( errno==ENO
30810 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ENT.#if OS_VXWOR
30820 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 73  KS.        || os
30830 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29 21  Access(zPath,0)!
30840 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b  =0.#endif.    ){
30850 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30860 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
30870 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65  NOENT;.    }else
30880 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
30890 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
308a0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22  _IOERR_DELETE, "
308b0 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b  unlink", zPath);
308c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
308d0 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  n rc;.  }.#ifnde
308e0 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
308f0 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28  _DIRSYNC.  if( (
30900 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20  dirSync & 1)!=0 
30910 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20  ){.    int fd;. 
30920 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
30930 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26  rectory(zPath, &
30940 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
30950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
30960 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
30970 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
30980 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20  ==-1 ).#else.   
30990 20 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29     if( fsync(fd)
309a0 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
309b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
309c0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
309d0 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
309e0 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61  NC, "fsync", zPa
309f0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
30a00 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
30a10 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
30a20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30a30 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
30a40 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
30a50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
30a60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
30a70 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
30a80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
30a90 65 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63  est the existenc
30aa0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
30ab0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
30ac0 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
30ad0 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
30ae0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
30af0 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
30b00 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
30b10 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
30b20 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
30b30 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
30b40 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
30b50 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
30b60 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
30b70 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
30b80 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
30b90 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
30ba0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
30bb0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
30bc0 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
30bd0 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
30be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30bf0 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
30c00 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
30c10 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
30c20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
30c30 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
30c40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
30c50 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
30c60 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
30c70 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
30c80 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
30c90 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
30ca0 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
30cb0 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
30cc0 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
30cd0 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
30ce0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
30cf0 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
30d00 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ere */.){.  UNUS
30d10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30d20 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
30d30 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
30d40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
30d50 43 45 53 53 3b 20 29 3b 0a 20 20 61 73 73 65 72  CESS; );.  asser
30d60 74 28 20 70 52 65 73 4f 75 74 21 3d 30 20 29 3b  t( pResOut!=0 );
30d70 0a 0a 20 20 2f 2a 20 54 68 65 20 73 70 65 63 20  ..  /* The spec 
30d80 73 61 79 73 20 74 68 65 72 65 20 61 72 65 20 74  says there are t
30d90 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 76 61  hree possible va
30da0 6c 75 65 73 20 66 6f 72 20 66 6c 61 67 73 2e 20  lues for flags. 
30db0 20 42 75 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74   But only.  ** t
30dc0 77 6f 20 6f 66 20 74 68 65 6d 20 61 72 65 20 61  wo of them are a
30dd0 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a  ctually used */.
30de0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
30df0 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
30e00 58 49 53 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d  XISTS || flags==
30e10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
30e20 41 44 57 52 49 54 45 20 29 3b 0a 0a 20 20 69 66  ADWRITE );..  if
30e30 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
30e40 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b  ACCESS_EXISTS ){
30e50 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
30e60 20 62 75 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f   buf;.    *pResO
30e70 75 74 20 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28  ut = (0==osStat(
30e80 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
30e90 62 75 66 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a  buf.st_size>0);.
30ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52    }else{.    *pR
30eb0 65 73 4f 75 74 20 3d 20 6f 73 41 63 63 65 73 73  esOut = osAccess
30ec0 28 7a 50 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f  (zPath, W_OK|R_O
30ed0 4b 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74  K)==0;.  }.  ret
30ee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30ef0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
30f00 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
30f10 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
30f20 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
30f30 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
30f40 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
30f50 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
30f60 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
30f70 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
30f80 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
30f90 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
30fa0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
30fb0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
30fc0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
30fd0 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
30fe0 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
30ff0 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
31000 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
31010 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
31020 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
31030 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
31040 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
31050 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
31060 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
31070 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
31080 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
31090 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
310a0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
310b0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
310c0 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
310d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
31100 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
31110 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
31120 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
31130 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
31140 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
31150 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20    int nByte;..  
31160 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
31170 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
31180 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
31190 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
311a0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
311b0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
311c0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
311d0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
311e0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
311f0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
31200 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
31210 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
31220 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
31230 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
31240 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
31250 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
31260 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
31270 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
31280 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
31290 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
312a0 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
312b0 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
312c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
312d0 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 41 74 74  pVfs);..  /* Att
312e0 65 6d 70 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  empt to resolve 
312f0 74 68 65 20 70 61 74 68 20 61 73 20 69 66 20 69  the path as if i
31300 74 20 77 65 72 65 20 61 20 73 79 6d 62 6f 6c 69  t were a symboli
31310 63 20 6c 69 6e 6b 2e 20 49 66 20 69 74 20 69 73  c link. If it is
31320 0a 20 20 2a 2a 20 61 20 73 79 6d 62 6f 6c 69 63  .  ** a symbolic
31330 20 6c 69 6e 6b 2c 20 74 68 65 20 72 65 73 6f 6c   link, the resol
31340 76 65 64 20 70 61 74 68 20 69 73 20 73 74 6f 72  ved path is stor
31350 65 64 20 69 6e 20 62 75 66 66 65 72 20 7a 4f 75  ed in buffer zOu
31360 74 5b 5d 2e 20 4f 72 2c 20 69 66 0a 20 20 2a 2a  t[]. Or, if.  **
31370 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20   the identified 
31380 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
31390 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 6f 72 20 64  mbolic link or d
313a0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
313b0 68 65 6e 0a 20 20 2a 2a 20 7a 50 61 74 68 20 69  hen.  ** zPath i
313c0 73 20 63 6f 70 69 65 64 20 64 69 72 65 63 74 6c  s copied directl
313d0 79 20 69 6e 74 6f 20 7a 4f 75 74 2e 20 45 69 74  y into zOut. Eit
313e0 68 65 72 20 77 61 79 2c 20 6e 42 79 74 65 20 69  her way, nByte i
313f0 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 20 20  s left set to.  
31400 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
31410 68 65 20 73 74 72 69 6e 67 20 63 6f 70 69 65 64  he string copied
31420 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 20 69 6e 20   into zOut[] in 
31430 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 6e 42 79  bytes.  */.  nBy
31440 74 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28  te = osReadlink(
31450 7a 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75  zPath, zOut, nOu
31460 74 2d 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  t-1);.  if( nByt
31470 65 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  e<0 ){.    if( e
31480 72 72 6e 6f 21 3d 45 49 4e 56 41 4c 20 26 26 20  rrno!=EINVAL && 
31490 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
314a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
314b0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
314c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
314d0 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 50 61   "readlink", zPa
314e0 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  th);.    }.    s
314f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31500 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22  nOut, zOut, "%s"
31510 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 6e 42  , zPath);.    nB
31520 79 74 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  yte = sqlite3Str
31530 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 7d  len30(zOut);.  }
31540 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 75 74 5b 6e  else{.    zOut[n
31550 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Byte] = '\0';.  
31560 7d 0a 0a 20 20 2f 2a 20 49 66 20 62 75 66 66 65  }..  /* If buffe
31570 72 20 7a 4f 75 74 5b 5d 20 6e 6f 77 20 63 6f 6e  r zOut[] now con
31580 74 61 69 6e 73 20 61 6e 20 61 62 73 6f 6c 75 74  tains an absolut
31590 65 20 70 61 74 68 20 74 68 65 72 65 20 69 73 20  e path there is 
315a0 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 0a 20 20 2a  nothing more.  *
315b0 2a 20 74 6f 20 64 6f 2e 20 49 66 20 69 74 20 63  * to do. If it c
315c0 6f 6e 74 61 69 6e 73 20 61 20 72 65 6c 61 74 69  ontains a relati
315d0 76 65 20 70 61 74 68 2c 20 64 6f 20 74 68 65 20  ve path, do the 
315e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
315f0 20 20 2a 2a 20 20 20 2a 20 6d 6f 76 65 20 74 68    **   * move th
31600 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
31610 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 69  string so that i
31620 74 20 69 73 20 61 74 20 74 68 65 20 65 6e 64 20  t is at the end 
31630 6f 66 20 74 68 0a 20 20 2a 2a 20 20 20 20 20 7a  of th.  **     z
31640 4f 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20  Out[] buffer..  
31650 2a 2a 20 20 20 2a 20 43 61 6c 6c 20 67 65 74 63  **   * Call getc
31660 77 64 28 29 20 74 6f 20 72 65 61 64 20 74 68 65  wd() to read the
31670 20 70 61 74 68 20 6f 66 20 74 68 65 20 63 75 72   path of the cur
31680 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
31690 65 63 74 6f 72 79 20 0a 20 20 2a 2a 20 20 20 20  ectory .  **    
316a0 20 69 6e 74 6f 20 74 68 65 20 73 74 61 72 74 20   into the start 
316b0 6f 66 20 74 68 65 20 7a 4f 75 74 5b 5d 20 62 75  of the zOut[] bu
316c0 66 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 41  ffer..  **   * A
316d0 70 70 65 6e 64 20 61 20 27 2f 27 20 63 68 61 72  ppend a '/' char
316e0 61 63 74 65 72 20 74 6f 20 74 68 65 20 63 77 64  acter to the cwd
316f0 20 73 74 72 69 6e 67 20 61 6e 64 20 6d 6f 76 65   string and move
31700 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 72   the .  **     r
31710 65 6c 61 74 69 76 65 20 70 61 74 68 20 62 61 63  elative path bac
31720 6b 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66  k within the buf
31730 66 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 69  fer so that it i
31740 6d 6d 65 64 69 61 74 65 6c 79 20 0a 20 20 2a 2a  mmediately .  **
31750 20 20 20 20 20 66 6f 6c 6c 6f 77 73 20 74 68 65       follows the
31760 20 27 2f 27 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   '/'..  **.  ** 
31770 54 68 69 73 20 63 6f 64 65 20 69 73 20 77 72 69  This code is wri
31780 74 74 65 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tten so that if 
31790 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
317a0 6f 66 20 74 68 65 20 43 57 44 20 61 6e 64 20 72  of the CWD and r
317b0 65 6c 61 74 69 76 65 0a 20 20 2a 2a 20 70 61 74  elative.  ** pat
317c0 68 20 61 72 65 20 6c 61 72 67 65 72 20 74 68 61  h are larger tha
317d0 6e 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  n the allocated 
317e0 73 69 7a 65 20 6f 66 20 7a 4f 75 74 5b 5d 20 74  size of zOut[] t
317f0 68 65 20 43 57 44 20 69 73 20 73 69 6c 65 6e 74  he CWD is silent
31800 6c 79 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  ly.  ** truncate
31810 64 20 74 6f 20 6d 61 6b 65 20 69 74 20 66 69 74  d to make it fit
31820 2e 20 54 68 69 73 20 69 73 20 4f 6b 2c 20 61 73  . This is Ok, as
31830 20 53 51 4c 69 74 65 20 72 65 66 75 73 65 73 20   SQLite refuses 
31840 74 6f 20 6f 70 65 6e 20 61 6e 79 0a 20 20 2a 2a  to open any.  **
31850 20 66 69 6c 65 20 66 6f 72 20 77 68 69 63 68 20   file for which 
31860 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
31870 74 75 72 6e 73 20 61 20 66 75 6c 6c 20 70 61 74  turns a full pat
31880 68 20 6c 61 72 67 65 72 20 74 68 61 6e 20 28 6e  h larger than (n
31890 4f 75 74 2d 38 29 0a 20 20 2a 2a 20 62 79 74 65  Out-8).  ** byte
318a0 73 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  s in size.  */. 
318b0 20 74 65 73 74 63 61 73 65 28 20 6e 42 79 74 65   testcase( nByte
318c0 3d 3d 6e 4f 75 74 2d 35 20 29 3b 0a 20 20 74 65  ==nOut-5 );.  te
318d0 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 6e  stcase( nByte==n
318e0 4f 75 74 2d 34 20 29 3b 0a 20 20 69 66 28 20 7a  Out-4 );.  if( z
318f0 4f 75 74 5b 30 5d 21 3d 27 2f 27 20 26 26 20 6e  Out[0]!='/' && n
31900 42 79 74 65 3c 6e 4f 75 74 2d 34 20 29 7b 0a 20  Byte<nOut-4 ){. 
31910 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
31920 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 4f 75 74   int nRem = nOut
31930 2d 6e 42 79 74 65 2d 31 3b 0a 20 20 20 20 6d 65  -nByte-1;.    me
31940 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e 52 65 6d  mmove(&zOut[nRem
31950 5d 2c 20 7a 4f 75 74 2c 20 6e 42 79 74 65 2b 31  ], zOut, nByte+1
31960 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e 52 65 6d  );.    zOut[nRem
31970 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  -1] = '\0';.    
31980 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
31990 74 2c 20 6e 52 65 6d 2d 31 29 3d 3d 30 20 29 7b  t, nRem-1)==0 ){
319a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
319b0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
319c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
319d0 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
319e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  );.    }.    nCw
319f0 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
31a00 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 61  n30(zOut);.    a
31a10 73 73 65 72 74 28 20 6e 43 77 64 3c 3d 6e 52 65  ssert( nCwd<=nRe
31a20 6d 2d 31 20 29 3b 0a 20 20 20 20 7a 4f 75 74 5b  m-1 );.    zOut[
31a30 6e 43 77 64 5d 20 3d 20 27 2f 27 3b 0a 20 20 20  nCwd] = '/';.   
31a40 20 6d 65 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e   memmove(&zOut[n
31a50 43 77 64 2b 31 5d 2c 20 26 7a 4f 75 74 5b 6e 52  Cwd+1], &zOut[nR
31a60 65 6d 5d 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20  em], nByte+1);. 
31a70 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
31a80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e  ITE_OK;.}...#ifn
31a90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31aa0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
31ab0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
31ac0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
31ad0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
31ae0 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
31af0 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
31b00 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
31b10 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
31b20 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
31b30 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  .*/.#include <dl
31b40 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f  fcn.h>.static vo
31b50 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73  id *unixDlOpen(s
31b60 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31b70 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  sed, const char 
31b80 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55  *zFilename){.  U
31b90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31ba0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
31bb0 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e  rn dlopen(zFilen
31bc0 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20  ame, RTLD_NOW | 
31bd0 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a  RTLD_GLOBAL);.}.
31be0 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61  ./*.** SQLite ca
31bf0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
31c00 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  n immediately af
31c10 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e  ter a call to un
31c20 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20  ixDlSym() or.** 
31c30 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69  unixDlOpen() fai
31c40 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75  ls (returns a nu
31c50 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20  ll pointer). If 
31c60 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20  a more detailed 
31c70 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65  error.** message
31c80 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69   is available, i
31c90 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
31ca0 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65  zBufOut. If no e
31cb0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
31cc0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42  is available, zB
31cd0 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e  ufOut is left un
31ce0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c  modified and SQL
31cf0 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75  ite uses a defau
31d00 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  lt.** error mess
31d10 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
31d20 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28  oid unixDlError(
31d30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
31d40 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
31d50 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
31d60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
31d70 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rr;.  UNUSED_PAR
31d80 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
31d90 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
31da0 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c  x();.  zErr = dl
31db0 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a  error();.  if( z
31dc0 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
31dd0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
31de0 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c  , zBufOut, "%s",
31df0 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e   zErr);.  }.  un
31e00 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
31e10 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
31e20 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65  unixDlSym(sqlite
31e30 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31e40 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
31e50 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  har*zSym))(void)
31e60 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43  {.  /* .  ** GCC
31e70 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
31e80 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74  errors says that
31e90 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c   C90 does not al
31ea0 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62  low a void* to b
31eb0 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f  e.  ** cast into
31ec0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31ed0 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79  function.  And y
31ee0 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64  et the library d
31ef0 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20  lsym() routine. 
31f00 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f   ** returns a vo
31f10 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61  id* which is rea
31f20 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
31f30 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f   a function.  So
31f40 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20   how do we.  ** 
31f50 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68  use dlsym() with
31f60 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
31f70 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72  s?.  **.  ** Var
31f80 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73  iable x below is
31f90 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61   defined to be a
31fa0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
31fb0 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20  nction taking.  
31fc0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f  ** parameters vo
31fd0 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68  id* and const ch
31fe0 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e  ar* and returnin
31ff0 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  g a pointer to a
32000 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
32010 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20  We initialize x 
32020 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  by assigning it 
32030 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
32040 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f   dlsym() functio
32050 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73  n..  ** (That as
32060 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  signment require
32070 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e  s a cast.)  Then
32080 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e   we call the fun
32090 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20  ction that.  ** 
320a0 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20  x points to.  . 
320b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f   **.  ** This wo
320c0 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c  rk-around is unl
320d0 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f  ikely to work co
320e0 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73  rrectly on any s
320f0 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a  ystem where.  **
32100 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e   you really cann
32110 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69  ot cast a functi
32120 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  on pointer into 
32130 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e  void*.  But then
32140 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  , on the.  ** ot
32150 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28  her hand, dlsym(
32160 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  ) will not work 
32170 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  on such a system
32180 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68   either, so we h
32190 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61  ave.  ** not rea
321a0 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e  lly lost anythin
321b0 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28  g..  */.  void (
321c0 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  *(*x)(void*,cons
321d0 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b  t char*))(void);
321e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
321f0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32200 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76  x = (void(*(*)(v
32210 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
32220 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a  ))(void))dlsym;.
32230 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c    return (*x)(p,
32240 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63   zSym);.}.static
32250 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73   void unixDlClos
32260 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
32270 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48  otUsed, void *pH
32280 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
32290 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
322a0 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70  ed);.  dlclose(p
322b0 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
322c0 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
322d0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
322e0 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
322f0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32300 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
32310 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30  ne unixDlError 0
32320 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32330 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
32340 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30  ne unixDlClose 0
32350 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
32360 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
32370 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74  of random data t
32380 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  o the supplied b
32390 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
323a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61  tatic int unixRa
323b0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
323c0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
323d0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
323e0 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
323f0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32400 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a  );.  assert((siz
32410 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f  e_t)nBuf>=(sizeo
32420 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66  f(time_t)+sizeof
32430 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57  (int)));..  /* W
32440 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61  e have to initia
32450 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65  lize zBuf to pre
32460 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72  vent valgrind fr
32470 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a  om reporting.  *
32480 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72  * errors.  The r
32490 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79  eports issued by
324a0 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e   valgrind are in
324b0 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75  correct - we wou
324c0 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74  ld.  ** prefer t
324d0 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65  hat the randomne
324e0 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ss be increased 
324f0 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66  by making use of
32500 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74   the.  ** uninit
32510 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e  ialized space in
32520 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67   zBuf - but valg
32530 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64  rind errors tend
32540 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73   to worry.  ** s
32550 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68  ome users.  Rath
32560 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69  er than argue, i
32570 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a  t seems easier j
32580 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ust to initializ
32590 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65  e.  ** the whole
325a0 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e   array and silen
325b0 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65  ce valgrind, eve
325c0 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
325d0 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a  less randomness.
325e0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64    ** in the rand
325f0 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20  om seed..  **.  
32600 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c  ** When testing,
32610 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42   initializing zB
32620 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20  uf[] to zero is 
32630 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74  all we do.  That
32640 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
32650 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
32660 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e  he same random n
32670 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20  umber sequence. 
32680 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a   This makes the.
32690 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61    ** tests repea
326a0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  table..  */.  me
326b0 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
326c0 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73  uf);.  randomnes
326d0 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28  sPid = osGetpid(
326e0 30 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e  0);  .#if !defin
326f0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
32700 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
32710 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45  TE_OMIT_RANDOMNE
32720 53 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  SS).  {.    int 
32730 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20  fd, got;.    fd 
32740 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f  = robust_open("/
32750 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
32760 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20  RDONLY, 0);.    
32770 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
32780 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
32790 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20    time(&t);.    
327a0 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26    memcpy(zBuf, &
327b0 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  t, sizeof(t));. 
327c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
327d0 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72  f[sizeof(t)], &r
327e0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69  andomnessPid, si
327f0 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50  zeof(randomnessP
32800 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
32810 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
32820 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50  zeof(randomnessP
32830 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
32840 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
32850 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
32860 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50  zeof(randomnessP
32870 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
32880 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20        do{ got = 
32890 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  osRead(fd, zBuf,
328a0 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
328b0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
328c0 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72  EINTR );.      r
328d0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66  obust_close(0, f
328e0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
328f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
32900 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a   return nBuf;.}.
32910 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
32920 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
32930 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
32940 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
32950 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  pt..** The argum
32960 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ent is the numbe
32970 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
32980 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65  s we want to sle
32990 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ep..** The retur
329a0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
329b0 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
329c0 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61  conds of sleep a
329d0 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65  ctually.** reque
329e0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  sted from the un
329f0 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
32a00 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d  ng system, a num
32a10 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  ber which.** mig
32a20 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ht be greater th
32a30 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
32a40 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74  he argument, but
32a50 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61   not less.** tha
32a60 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
32a70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
32a80 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  ixSleep(sqlite3_
32a90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
32aa0 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b  t microseconds){
32ab0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
32ac0 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
32ad0 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73  c sp;..  sp.tv_s
32ae0 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64  ec = microsecond
32af0 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73  s / 1000000;.  s
32b00 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63  p.tv_nsec = (mic
32b10 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30  roseconds % 1000
32b20 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e  000) * 1000;.  n
32b30 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55  anosleep(&sp, NU
32b40 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  LL);.  UNUSED_PA
32b50 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32b60 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
32b70 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64  seconds;.#elif d
32b80 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
32b90 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
32ba0 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
32bb0 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  oseconds);.  UNU
32bc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32bd0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
32be0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
32bf0 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e  else.  int secon
32c00 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ds = (microsecon
32c10 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30  ds+999999)/10000
32c20 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f  00;.  sleep(seco
32c30 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
32c40 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32c50 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
32c60 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
32c70 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
32c80 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
32c90 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
32ca0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
32cb0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
32cc0 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
32cd0 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
32ce0 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
32cf0 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
32d00 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
32d10 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
32d20 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
32d30 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
32d40 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
32d50 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
32d60 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
32d70 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
32d80 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
32d90 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
32da0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
32db0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
32dc0 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
32dd0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
32de0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
32df0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
32e00 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
32e10 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
32e20 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
32e30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
32e40 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
32e50 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
32e60 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
32e70 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
32e80 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
32e90 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
32ea0 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
32eb0 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
32ec0 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
32ed0 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
32ee0 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
32ef0 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
32f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32f10 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
32f20 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
32f30 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
32f40 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
32f50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
32f60 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
32f70 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
32f80 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65  *NotUsed, sqlite
32f90 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
32fa0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
32fb0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
32fc0 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
32fd0 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
32fe0 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74  4)8640000;.  int
32ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33000 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
33010 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
33020 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
33030 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
33040 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30  ite3_int64)t)*10
33050 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
33060 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
33070 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
33080 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
33090 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
330a0 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
330b0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
330c0 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
330d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
330e0 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
330f0 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
33100 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
33110 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28  imeval sNow;.  (
33120 76 6f 69 64 29 67 65 74 74 69 6d 65 6f 66 64 61  void)gettimeofda
33130 79 28 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a  y(&sNow, 0);  /*
33140 20 43 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76   Cannot fail giv
33150 65 6e 20 76 61 6c 69 64 20 61 72 67 75 6d 65 6e  en valid argumen
33160 74 73 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d  ts */.  *piNow =
33170 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
33180 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
33190 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
331a0 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30  Now.tv_usec/1000
331b0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
331c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
331d0 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
331e0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
331f0 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
33200 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
33210 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
33220 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
33230 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
33240 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33250 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sed);.  return r
33260 63 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e  c;.}..#if 0 /* N
33270 6f 74 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a  ot used */./*.**
33280 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
33290 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
332a0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
332b0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
332c0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
332d0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
332e0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
332f0 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
33300 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
33310 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
33320 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
33330 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
33340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
33350 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
33360 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
33370 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
33380 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
33390 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  t64 i = 0;.  int
333a0 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   rc;.  UNUSED_PA
333b0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
333c0 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72  ;.  rc = unixCur
333d0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
333e0 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
333f0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
33400 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
33410 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
33420 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30 0a 23  xCurrentTime 0.#
33430 65 6e 64 69 66 0a 0a 23 69 66 20 30 20 20 2f 2a  endif..#if 0  /*
33440 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a   Not used */./*.
33450 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
33460 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
33470 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
33480 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
33490 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
334a0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
334b0 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
334c0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
334d0 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
334e0 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
334f0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
33500 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
33510 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
33520 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
33530 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
33540 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
33550 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
33560 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
33570 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
33580 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
33590 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
335a0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
335b0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
335c0 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
335d0 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
335e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
335f0 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
33600 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33610 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
33620 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
33630 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
33640 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
33650 65 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  e unixGetLastErr
33660 6f 72 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  or 0.#endif.../*
33670 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
33680 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
33690 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
336a0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
336b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
336d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
33710 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
33720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33760 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
33770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
33780 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
33790 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
337a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
337b0 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
337c0 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
337d0 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
337e0 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
337f0 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
33800 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
33810 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
33820 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
33830 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
33840 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
33850 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
33860 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
33870 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
33880 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
33890 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
338a0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
338b0 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
338c0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
338d0 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
338e0 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
338f0 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
33900 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
33910 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
33920 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
33930 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
33940 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
33950 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
33960 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
33970 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
33980 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
33990 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
339a0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
339b0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
339c0 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
339d0 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
339e0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
339f0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
33a00 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
33a10 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
33a20 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
33a30 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
33a40 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
33a50 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
33a60 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
33a70 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
33a80 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
33a90 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
33aa0 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
33ab0 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
33ac0 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
33ad0 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
33ae0 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
33af0 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
33b00 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
33b10 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
33b20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
33b30 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
33b40 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
33b50 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
33b60 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
33b70 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
33b80 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
33b90 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
33ba0 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
33bb0 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
33bc0 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
33bd0 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
33be0 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
33bf0 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
33c00 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
33c10 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
33c20 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
33c30 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
33c40 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
33c50 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
33c60 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
33c70 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
33c80 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
33c90 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20    0x40000000.** 
33ca0 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59       RESERVED_BY
33cb0 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  TE       0x40000
33cc0 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  001.**      SHAR
33cd0 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20  ED_RANGE        
33ce0 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78  0x40000002 -> 0x
33cf0 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54  40000200.**.** T
33d00 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f  his works well o
33d10 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
33d20 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f   system, but sho
33d30 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78  ws a nearly 100x
33d40 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20  .** slowdown in 
33d50 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  read performance
33d60 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20   on AFP because 
33d70 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64  the AFP client d
33d80 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72  isables.** the r
33d90 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62  ead cache when b
33da0 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
33db0 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e  are present.  En
33dc0 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a  abling the read.
33dd0 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73  ** cache exposes
33de0 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e   a cache coheren
33df0 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20  cy problem that 
33e00 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c  is present on al
33e10 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72  l OS X.** suppor
33e20 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65  ted network file
33e30 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61   systems.  NFS a
33e40 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65  nd AFP both obse
33e50 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65  rve the.** close
33e60 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69  -to-open semanti
33e70 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  cs for ensuring 
33e80 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a  cache coherency.
33e90 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73  ** [http://nfs.s
33ea0 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23  ourceforge.net/#
33eb0 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64  faq_a8], which d
33ec0 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76  oes not effectiv
33ed0 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74  ely.** address t
33ee0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  he requirements 
33ef0 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64  for concurrent d
33f00 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62  atabase access b
33f10 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65  y multiple.** re
33f20 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
33f30 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77  s.** [http://www
33f40 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69  .nabble.com/SQLi
33f50 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d  te-on-NFS-cache-
33f60 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35  coherency-td1565
33f70 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a  5701.html]..**.*
33f80 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65  * To address the
33f90 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64   performance and
33fa0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
33fb0 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66   issues, proxy f
33fc0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63  ile locking.** c
33fd0 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64  hanges the way d
33fe0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69  atabase access i
33ff0 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20  s controlled by 
34000 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20  limiting access 
34010 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68  to a.** single h
34020 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e  ost at a time an
34030 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f  d moving file lo
34040 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64  cks off of the d
34050 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
34060 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79  and onto a proxy
34070 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63   file on the loc
34080 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  al file system. 
34090 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67   .**.**.** Using
340a0 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20   proxy locks.** 
340b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
340c0 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a  -.**.** C APIs.*
340d0 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69  *.**  sqlite3_fi
340e0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64  le_control(db, d
340f0 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bname, SQLITE_FC
34100 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
34110 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34130 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
34140 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
34150 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
34160 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
34170 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
34180 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a  LOCKPROXYFILE,.*
34190 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
341a0 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f          &<proxy_
341b0 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a  path>);.**.**.**
341c0 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a   SQL pragmas.**.
341d0 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
341e0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
341f0 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74  _file=<proxy_pat
34200 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20  h> | :auto:.**  
34210 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
34220 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
34230 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69  e.**.** Specifyi
34240 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e  ng ":auto:" mean
34250 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  s that if there 
34260 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20  is a conch file 
34270 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a  with a matching.
34280 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74  ** host ID in it
34290 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68  , the proxy path
342a0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   in the conch fi
342b0 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  le will be used,
342c0 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20   otherwise.** a 
342d0 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64  proxy path based
342e0 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74   on the user's t
342f0 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20  emp dir.** (via 
34300 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
34310 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
34320 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75  ,...)) will be u
34330 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61  sed and the.** a
34340 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  ctual proxy file
34350 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74   name is generat
34360 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65  ed from the name
34370 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65   and path of the
34380 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
34390 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
343a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72  .**.**       For
343b0 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22   database path "
343c0 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62  /Users/me/foo.db
343d0 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20  " .**       The 
343e0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
343f0 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69  e "<tmpdir>/sqli
34400 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f  teplocks/_Users_
34410 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22  me_foo.db:auto:"
34420 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c  ).**.** Once a l
34430 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e  ock proxy is con
34440 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61  figured for a da
34450 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
34460 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a  n, it can not.**
34470 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77   be removed, how
34480 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73  ever it may be s
34490 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66  witched to a dif
344a0 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74  ferent proxy pat
344b0 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f  h via.** the abo
344c0 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e  ve APIs (assumin
344d0 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  g the conch file
344e0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65   is not being he
344f0 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a  ld by another.**
34500 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70   connection or p
34510 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a  rocess). .**.**.
34520 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63  ** How proxy loc
34530 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d  king works.** --
34540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34550 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  -----.**.** Prox
34560 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72  y file locking r
34570 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20  elies primarily 
34580 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f  on two new suppo
34590 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a  rting files: .**
345a0 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66  .**   *  conch f
345b0 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63  ile to limit acc
345c0 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
345d0 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69  ase file to a si
345e0 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20  ngle host.**    
345f0 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a    at a time.**.*
34600 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c  *   *  proxy fil
34610 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72  e to act as a pr
34620 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69  oxy for the advi
34630 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61  sory locks norma
34640 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65  lly.**      take
34650 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
34660 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63  e.**.** The conc
34670 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20  h file - to use 
34680 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71  a proxy file, sq
34690 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20  lite must first 
346a0 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22  "hold the conch"
346b0 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e  .** by taking an
346c0 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68   sqlite-style sh
346d0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
346e0 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61   conch file, rea
346f0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  ding the.** cont
34700 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69  ents and compari
34710 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e  ng the host's un
34720 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65  ique host ID (se
34730 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63  e below) and loc
34740 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20  k.** proxy path 
34750 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75  against the valu
34760 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
34770 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e   conch.  The con
34780 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74  ch file is.** st
34790 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
347a0 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
347b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
347c0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  and the file nam
347d0 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65  e.** is patterne
347e0 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
347f0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
34800 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d  s ".<databasenam
34810 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66  e>-conch"..** If
34820 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
34830 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
34840 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  or its contents 
34850 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
34860 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
34870 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
34880 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
34890 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
348a0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
348b0 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
348c0 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
348d0 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
348e0 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
348f0 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
34900 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
34910 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
34920 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
34930 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
34940 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
34950 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
34960 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
34970 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
34980 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
34990 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
349a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
349b0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
349c0 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
349d0 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
349e0 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
349f0 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
34a00 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
34a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34a20 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
34a30 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
34a40 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
34a50 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
34a60 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
34a70 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
34a80 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
34a90 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
34aa0 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
34ab0 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
34ac0 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
34ad0 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
34ae0 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
34af0 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
34b00 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
34b10 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
34b20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
34b30 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
34b40 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
34b50 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
34b60 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
34b70 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
34b80 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
34b90 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
34ba0 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
34bb0 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
34bc0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
34bd0 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
34be0 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
34bf0 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
34c00 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
34c10 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
34c20 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
34c30 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
34c40 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
34c50 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
34c60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
34c70 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
34c80 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
34c90 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
34ca0 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
34cb0 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
34cc0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
34cd0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
34ce0 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
34cf0 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
34d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
34d10 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
34d20 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
34d30 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
34d40 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
34d50 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
34d60 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
34d70 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
34d80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
34d90 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
34da0 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
34db0 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
34dc0 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
34dd0 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
34de0 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
34df0 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
34e00 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
34e10 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
34e20 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
34e30 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
34e40 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
34e50 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
34e60 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
34e70 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
34e80 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
34e90 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
34ea0 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
34eb0 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
34ec0 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
34ed0 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
34ee0 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
34ef0 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
34f00 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
34f10 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
34f20 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
34f30 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
34f40 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
34f50 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
34f60 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
34f70 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
34f80 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
34f90 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
34fa0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
34fb0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
34fc0 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
34fd0 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
34fe0 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
34ff0 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
35000 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
35010 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
35020 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
35030 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
35040 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
35050 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
35060 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
35070 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
35080 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
35090 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
350a0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
350b0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
350c0 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
350d0 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
350e0 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
350f0 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
35100 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
35110 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
35120 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c  (explicitly call
35130 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46  ing the SQLITE_F
35140 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
35150 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72  XYFILE pragma or
35160 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f  .** sqlite_file_
35170 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e  control API is n
35180 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53  ot affected by S
35190 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
351a0 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a  Y_LOCKING)..*/..
351b0 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  /*.** Proxy lock
351c0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
351d0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20  lable on MacOSX 
351e0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
351f0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
35200 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
35210 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a  ING_STYLE../*.**
35220 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   The proxyLockin
35230 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65  gContext has the
35240 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73   path and file s
35250 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
35260 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64  e remote .** and
35270 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c   local proxy fil
35280 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65  es in it.*/.type
35290 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79  def struct proxy
352a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70  LockingContext p
352b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
352c0 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79  xt;.struct proxy
352d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
352e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
352f0 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  chFile;         
35300 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69  /* Open conch fi
35310 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f  le */.  char *co
35320 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20  nchFilePath;    
35330 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35340 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  the conch file *
35350 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f  /.  unixFile *lo
35360 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20  ckProxy;        
35370 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c   /* Open proxy l
35380 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
35390 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74  ar *lockProxyPat
353a0 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
353b0 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20  me of the proxy 
353c0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
353d0 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
353e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
353f0 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ame of the open 
35400 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  file */.  int co
35410 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20  nchHeld;        
35420 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74         /* 1 if t
35430 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64  he conch is held
35440 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73  , -1 if lockless
35450 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73   */.  int nFails
35460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
35480 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69  conch taking fai
35490 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
354a0 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  *oldLockingConte
354b0 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  xt;     /* Origi
354c0 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65  nal lockingconte
354d0 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e  xt to restore on
354e0 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69   close */.  sqli
354f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63  te3_io_methods c
35500 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64  onst *pOldMethod
35510 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
35520 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f  l I/O methods fo
35530 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  r close */.};../
35540 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  * .** The proxy 
35550 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66  lock file path f
35560 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
35570 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69  at dbPath is wri
35580 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c  tten into lPath,
35590 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20   .** which must 
355a0 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20  point to valid, 
355b0 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20  writable memory 
355c0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
355d0 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68   a maxLen length
355e0 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a  .** file path. .
355f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35600 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63  oxyGetLockPath(c
35610 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
35620 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20  h, char *lPath, 
35630 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a  size_t maxLen){.
35640 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
35650 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b   dbLen;.  int i;
35660 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f  ..#ifdef LOCKPRO
35670 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74  XYDIR.  len = st
35680 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43  rlcpy(lPath, LOC
35690 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65  KPROXYDIR, maxLe
356a0 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65  n);.#else.# ifde
356b0 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  f _CS_DARWIN_USE
356c0 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20  R_TEMP_DIR.  {. 
356d0 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28     if( !confstr(
356e0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
356f0 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c  TEMP_DIR, lPath,
35700 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20   maxLen) ){.    
35710 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
35720 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20  OCKPATH  failed 
35730 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d  %s errno=%d pid=
35740 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
35750 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72        lPath, err
35760 6e 6f 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  no, osGetpid(0))
35770 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
35780 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
35790 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  K;.    }.    len
357a0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
357b0 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22  , "sqliteplocks"
357c0 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20  , maxLen);    . 
357d0 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20   }.# else.  len 
357e0 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
357f0 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e   "/tmp/", maxLen
35800 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  );.# endif.#endi
35810 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c  f..  if( lPath[l
35820 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  en-1]!='/' ){.  
35830 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
35840 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c  lPath, "/", maxL
35850 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  en);.  }.  .  /*
35860 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64   transform the d
35870 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71  b path to a uniq
35880 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f  ue cache name */
35890 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29  .  dbLen = (int)
358a0 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a  strlen(dbPath);.
358b0 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62    for( i=0; i<db
358c0 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29  Len && (i+len+7)
358d0 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b  <(int)maxLen; i+
358e0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  +){.    char c =
358f0 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20   dbPath[i];.    
35900 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28  lPath[i+len] = (
35910 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20  c=='/')?'_':c;. 
35920 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e   }.  lPath[i+len
35930 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61  ]='\0';.  strlca
35940 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a  t(lPath, ":auto:
35950 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53  ", maxLen);.  OS
35960 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
35970 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
35980 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
35990 22 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70  ", lPath, osGetp
359a0 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72  id(0)));.  retur
359b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
359c0 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
359d0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
359e0 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
359f0 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
35a00 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
35a10 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
35a20 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
35a30 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
35a40 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
35a50 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
35a60 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
35a70 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
35a80 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
35a90 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
35aa0 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
35ab0 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
35ac0 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
35ad0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
35ae0 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
35af0 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
35b00 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
35b10 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
35b20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
35b30 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
35b40 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
35b50 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
35b60 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
35b70 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
35b80 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
35b90 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
35ba0 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
35bb0 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
35bc0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
35bd0 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
35be0 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
35bf0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
35c00 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
35c10 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
35c20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
35c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73  ;.        if( os
35c40 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  Mkdir(buf, SQLIT
35c50 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
35c60 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
35c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
35c80 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
35c90 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
35ca0 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
35cb0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
35cc0 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
35cd0 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
35ce0 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
35cf0 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
35d00 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
35d10 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d30 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
35d40 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
35d50 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
35d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
35d70 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20  urn err;.       
35d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
35d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
35da0 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  rt=i+1;.    }.  
35db0 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50    buf[i] = lockP
35dc0 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53  ath[i];.  }.  OS
35dd0 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
35de0 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
35df0 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
35e00 64 5c 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73  d\n",lockPath,os
35e10 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72  Getpid(0)));.  r
35e20 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
35e30 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56  * Create a new V
35e40 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  FS file descript
35e50 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65  or (stored in me
35e60 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
35e70 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
35e80 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74  lloc) and open t
35e90 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70  he file named "p
35ea0 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65  ath" in the file
35eb0 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
35ec0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
35ed0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74   responsible not
35ee0 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e   only for closin
35ef0 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  g the file descr
35f00 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73  iptor.** but als
35f10 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  o for freeing th
35f20 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  e memory associa
35f30 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c  ted with the fil
35f40 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
35f50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35f60 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
35f70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
35f80 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a  *path,        /*
35f90 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65   path for the ne
35fa0 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20  w unixFile */.  
35fb0 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46    unixFile **ppF
35fc0 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e  ile,       /* un
35fd0 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61  ixFile created a
35fe0 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72  nd returned by r
35ff0 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ef */.    int is
36000 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20  lockfile        
36010 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72     /* if non zer
36020 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77  o missing dirs w
36030 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a  ill be created *
36040 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d  /.) {.  int fd =
36050 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   -1;.  unixFile 
36060 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20  *pNew;.  int rc 
36070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
36080 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
36090 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
360a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64  .  sqlite3_vfs d
360b0 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74  ummyVfs;.  int t
360c0 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69  errno = 0;.  Uni
360d0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
360e0 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a  ed = NULL;..  /*
360f0 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f   1. first try to
36100 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65   open/create the
36110 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66   file.  ** 2. if
36120 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64   that fails, and
36130 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20   this is a lock 
36140 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29  file (not-conch)
36150 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20  , try creating. 
36160 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64   ** the parent d
36170 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74  irectories and t
36180 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20  hen try again.. 
36190 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66   ** 3. if that f
361a0 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65  ails, try to ope
361b0 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d  n the file read-
361c0 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77  only.  ** otherw
361d0 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20  ise return BUSY 
361e0 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f  (if lock file) o
361f0 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74  r CANTOPEN for t
36200 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20  he conch file.  
36210 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66  */.  pUnused = f
36220 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61  indReusableFd(pa
36230 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  th, openFlags);.
36240 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
36250 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65  .    fd = pUnuse
36260 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d->fd;.  }else{.
36270 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
36280 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
36290 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
362a0 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
362b0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
362c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
362d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
362e0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
362f0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
36300 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
36310 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
36320 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66  errno;.    if( f
36330 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  d<0 && errno==EN
36340 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69  OENT && islockfi
36350 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
36360 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
36370 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c  ath(path) == SQL
36380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36390 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
363a0 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
363b0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  gs, 0);.      }.
363c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
363d0 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  fd<0 ){.    open
363e0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
363f0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
36400 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
36410 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
36420 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
36430 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
36440 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b  {.    if( islock
36450 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65  file ){.      re
36460 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
36470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
36480 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20  ch (terrno) {.  
36490 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a      case EACCES:
364a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
364b0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
364c0 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20     case EIO: .  
364d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
364e0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20  ITE_IOERR_LOCK; 
364f0 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  /* even though i
36500 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a  t is the conch *
36510 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  /.      default:
36520 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
36530 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
36540 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
36550 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69    .  pNew = (uni
36560 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
36570 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
36580 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
36590 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
365a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
365b0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  EM;.    goto end
365c0 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20  _create_proxy;. 
365d0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
365e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
365f0 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  File));.  pNew->
36600 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
36610 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28  Flags;.  memset(
36620 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69  &dummyVfs, 0, si
36630 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b  zeof(dummyVfs));
36640 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70  .  dummyVfs.pApp
36650 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61  Data = (void*)&a
36660 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b  utolockIoFinder;
36670 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d  .  dummyVfs.zNam
36680 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70  e = "dummy";.  p
36690 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
366a0 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
366b0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
366c0 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
366d0 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
366e0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
366f0 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
36700 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  , (sqlite3_file*
36710 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b  )pNew, path, 0);
36720 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
36740 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
36750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36760 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
36770 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
36780 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
36790 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
367a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
367b0 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
367c0 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
367d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
367e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
367f0 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
36800 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
36810 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
36820 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
36830 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
36840 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
36850 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
36860 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
36870 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
36880 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
36890 6e 67 74 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ngth */..#ifdef 
368a0 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44  HAVE_GETHOSTUUID
368b0 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64  ./* Not always d
368c0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  efined in the he
368d0 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68  aders as it ough
368e0 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72  t to be */.exter
368f0 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69  n int gethostuui
36900 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e  d(uuid_t id, con
36910 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
36920 65 63 20 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69  ec *wait);.#endi
36930 66 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  f../* get the ho
36940 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
36950 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
36960 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
36970 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
36980 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
36990 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
369a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
369b0 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
369c0 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
369d0 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
369e0 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
369f0 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
36a00 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
36a10 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
36a20 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
36a30 4e 29 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  N);.#ifdef HAVE_
36a40 47 45 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a  GETHOSTUUID.  {.
36a50 20 20 20 20 73 74 72 75 63 74 20 74 69 6d 65 73      struct times
36a60 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31  pec timeout = {1
36a70 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74  , 0}; /* 1 sec t
36a80 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66  imeout */.    if
36a90 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48  ( gethostuuid(pH
36aa0 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29  ostID, &timeout)
36ab0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72   ){.      int er
36ac0 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
36ad0 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
36ae0 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d         *pError =
36af0 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20   err;.      }.  
36b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36b10 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
36b20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
36b30 44 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72 72  D_PARAMETER(pErr
36b40 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  or);.#endif.#ifd
36b50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
36b60 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c   /* simulate mul
36b70 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
36b80 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
36b90 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
36ba0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
36bb0 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20  3_hostid_num != 
36bc0 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b  0){.    pHostID[
36bd0 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73  0] = (char)(pHos
36be0 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28  tID[0] + (char)(
36bf0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
36c00 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d  um & 0xFF));.  }
36c10 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74  .#endif.  .  ret
36c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
36c30 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  ../* The conch f
36c40 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
36c50 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64   header, host id
36c60 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
36c70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ath. */.#define 
36c80 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
36c90 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65  ON 2   /* 1-byte
36ca0 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65   header, 16-byte
36cb0 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a   host id, path *
36cc0 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
36cd0 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20  HEADERLEN    1  
36ce0 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
36cf0 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a  eader length */.
36d00 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41  #define PROXY_PA
36d10 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58  THINDEX    (PROX
36d20 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
36d30 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65  Y_HOSTIDLEN).#de
36d40 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f  fine PROXY_MAXCO
36d50 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48  NCHLEN  (PROXY_H
36d60 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
36d70 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48  OSTIDLEN+MAXPATH
36d80 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b  LEN)../* .** Tak
36d90 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68  es an open conch
36da0 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68   file, copies th
36db0 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20  e contents to a 
36dc0 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65  new path and the
36dd0 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62  n moves .** it b
36de0 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20  ack.  The newly 
36df0 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66  created file's f
36e00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
36e10 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  s assigned to th
36e20 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20  e.** conch file 
36e30 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69  structure and fi
36e40 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e  nally the origin
36e50 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65  al conch file de
36e60 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20  scriptor is .** 
36e70 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73  closed.  Returns
36e80 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73   zero if success
36e90 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ful..*/.static i
36ea0 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  nt proxyBreakCon
36eb0 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
36ec0 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
36ed0 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78  yHostID){.  prox
36ee0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36ef0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
36f00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
36f10 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
36f20 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
36f30 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
36f40 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
36f50 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58    char tPath[MAX
36f60 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  PATHLEN];.  char
36f70 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f   buf[PROXY_MAXCO
36f80 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  NCHLEN];.  char 
36f90 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63  *cPath = pCtx->c
36fa0 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20  onchFilePath;.  
36fb0 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d  size_t readLen =
36fc0 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74   0;.  size_t pat
36fd0 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  hLen = 0;.  char
36fe0 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22   errmsg[64] = ""
36ff0 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
37000 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a  .  int rc = -1;.
37010 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
37020 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20  ER(myHostID);.. 
37030 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77   /* create a new
37040 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65   path by replace
37050 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d   the trailing '-
37060 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72  conch' with '-br
37070 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65  eak' */.  pathLe
37080 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74  n = strlcpy(tPat
37090 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54  h, cPath, MAXPAT
370a0 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74  HLEN);.  if( pat
370b0 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20  hLen>MAXPATHLEN 
370c0 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20  || pathLen<6 || 
370d0 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26  .     (strlcpy(&
370e0 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d  tPath[pathLen-5]
370f0 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d  , "break", 6) !=
37100 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   5) ){.    sqlit
37110 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37120 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
37130 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c  g,"path error (l
37140 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74  en %d)",(int)pat
37150 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  hLen);.    goto 
37160 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
37170 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65   }.  /* read the
37180 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a   conch content *
37190 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73  /.  readLen = os
371a0 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
371b0 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d  >h, buf, PROXY_M
371c0 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a  AXCONCHLEN, 0);.
371d0 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52    if( readLen<PR
371e0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b  OXY_PATHINDEX ){
371f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
37200 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
37210 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61  msg),errmsg,"rea
37220 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  d error (len %d)
37230 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b  ",(int)readLen);
37240 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
37250 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
37260 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  * write it out t
37270 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  o the temporary 
37280 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20  break file */.  
37290 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
372a0 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c  (tPath, (O_RDWR|
372b0 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c  O_CREAT|O_EXCL),
372c0 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20   0);.  if( fd<0 
372d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
372e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
372f0 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
37300 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28  "create failed (
37310 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
37320 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
37330 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
37340 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66  osPwrite(fd, buf
37350 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d  , readLen, 0) !=
37360 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65   (ssize_t)readLe
37370 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
37380 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
37390 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
373a0 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20  , "write failed 
373b0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
373c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
373d0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
373e0 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63   rename(tPath, c
373f0 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c  Path) ){.    sql
37400 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
37410 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
37420 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61  rmsg, "rename fa
37430 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
37440 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
37450 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
37460 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69    rc = 0;.  fpri
37470 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f  ntf(stderr, "bro
37480 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ke stale lock on
37490 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a   %s\n", cPath);.
374a0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
374b0 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  File, conchFile-
374c0 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
374d0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20   conchFile->h = 
374e0 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  fd;.  conchFile-
374f0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52  >openFlags = O_R
37500 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a  DWR | O_CREAT;..
37510 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20  end_breaklock:. 
37520 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
37530 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
37540 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68    osUnlink(tPath
37550 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
37560 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c  close(pFile, fd,
37570 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
37580 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  }.    fprintf(st
37590 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f  derr, "failed to
375a0 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63   break stale loc
375b0 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20  k on %s, %s\n", 
375c0 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a  cPath, errmsg);.
375d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
375e0 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20  .}../* Take the 
375f0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f  requested lock o
37600 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
37610 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61   and break a sta
37620 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a  le lock if the .
37630 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  ** host id match
37640 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
37650 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  t proxyConchLock
37660 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
37670 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
37680 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29  D, int lockType)
37690 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
376a0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
376b0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
376c0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
376d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
376e0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
376f0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
37700 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  chFile;.  int rc
37710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37720 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a  int nTries = 0;.
37730 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
37740 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a  c conchModTime;.
37750 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e    .  memset(&con
37760 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69  chModTime, 0, si
37770 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d  zeof(conchModTim
37780 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  e));.  do {.    
37790 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
377a0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
377b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
377c0 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
377d0 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b  e);.    nTries +
377e0 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  +;.    if( rc==S
377f0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
37800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f      /* If the lo
37810 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29  ck failed (busy)
37820 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74  :.       * 1st t
37830 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20  ry: get the mod 
37840 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  time of the conc
37850 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64  h, wait 0.5s and
37860 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20   try again. .   
37870 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66      * 2nd try: f
37880 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74  ail if the mod t
37890 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68  ime changed or h
378a0 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72  ost id is differ
378b0 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20  ent, wait .     
378c0 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30    *           10
378d0 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61   sec and try aga
378e0 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20  in.       * 3rd 
378f0 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c  try: break the l
37900 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  ock unless the m
37910 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e  od time has chan
37920 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ged..       */. 
37930 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
37940 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20   buf;.      if( 
37950 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c  osFstat(conchFil
37960 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20  e->h, &buf) ){. 
37970 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
37980 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
37990 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  no);.        ret
379a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
379b0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
379c0 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
379d0 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20  nTries==1 ){.   
379e0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
379f0 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65  e = buf.st_mtime
37a00 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73  spec;.        us
37a10 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a  leep(500000); /*
37a20 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e   wait 0.5 sec an
37a30 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
37a40 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63  gain*/.        c
37a50 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
37a60 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
37a70 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20  ( nTries>1 );.  
37a80 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64      if( conchMod
37a90 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62  Time.tv_sec != b
37aa0 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
37ab0 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20  tv_sec || .     
37ac0 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
37ad0 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e  .tv_nsec != buf.
37ae0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
37af0 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nsec ){.        
37b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
37b10 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SY;.      }.    
37b20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37b30 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20  ies==2 ){  .    
37b40 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52      char tBuf[PR
37b50 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
37b60 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  ;.        int le
37b70 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
37b80 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20  hFile->h, tBuf, 
37b90 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
37ba0 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  N, 0);.        i
37bb0 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  f( len<0 ){.    
37bc0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
37bd0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
37be0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  o);.          re
37bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
37c00 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
37c10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  }.        if( le
37c20 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n>PROXY_PATHINDE
37c30 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63  X && tBuf[0]==(c
37c40 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
37c50 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20  ERSION){.       
37c60 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61     /* don't brea
37c70 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68  k the lock if th
37c80 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27  e host id doesn'
37c90 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
37ca0 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63       if( 0!=memc
37cb0 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48  mp(&tBuf[PROXY_H
37cc0 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
37cd0 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
37ce0 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  DLEN) ){.       
37cf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37d00 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
37d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
37d20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
37d30 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
37d40 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72   lock on short r
37d50 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e  ead or a version
37d60 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20   mismatch */.   
37d70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37d80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
37d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c     }.        usl
37da0 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f  eep(10000000); /
37db0 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e  * wait 10 sec an
37dc0 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
37dd0 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  gain */.        
37de0 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20  continue; .     
37df0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
37e00 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d  assert( nTries==
37e10 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  3 );.      if( 0
37e20 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  ==proxyBreakConc
37e30 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
37e40 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20  ostID) ){.      
37e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
37e60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  ;.        if( lo
37e70 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  ckType==EXCLUSIV
37e80 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
37e90 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
37ea0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
37eb0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
37ec0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41  *)conchFile, SHA
37ed0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
37ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
37ef0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
37f00 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
37f10 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
37f20 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
37f30 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54  conchFile, lockT
37f40 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ype);.        }.
37f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
37f60 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c  } while( rc==SQL
37f70 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69  ITE_BUSY && nTri
37f80 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74  es<3 );.  .  ret
37f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
37fa0 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79  kes the conch by
37fb0 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64   taking a shared
37fc0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74   lock and read t
37fd0 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63  he contents conc
37fe0 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61  h, if .** lockPa
37ff0 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  th is non-NULL, 
38000 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
38010 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d  lock file path m
38020 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55  ust match.  A NU
38030 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  LL .** lockPath 
38040 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c  means that the l
38050 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63  ockPath in the c
38060 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
38070 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a  e used if the .*
38080 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68  * host IDs match
38090 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20  , or a new lock 
380a0 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e  path will be gen
380b0 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63  erated automatic
380c0 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69  ally .** and wri
380d0 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63  tten to the conc
380e0 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  h file..*/.stati
380f0 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43  c int proxyTakeC
38100 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
38110 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  File){.  proxyLo
38120 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
38130 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
38140 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
38150 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
38160 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74  t; .  .  if( pCt
38170 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20  x->conchHeld!=0 
38180 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
38190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
381a0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
381b0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
381c0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20  ->conchFile;.   
381d0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
381e0 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72  ;.    int pError
381f0 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72   = 0;.    char r
38200 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  eadBuf[PROXY_MAX
38210 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63  CONCHLEN];.    c
38220 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58  har lockPath[MAX
38230 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68  PATHLEN];.    ch
38240 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68  ar *tempLockPath
38250 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
38260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
38270 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74 65 43  .    int createC
38280 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  onch = 0;.    in
38290 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20  t hostIdMatch = 
382a0 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c  0;.    int readL
382b0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  en = 0;.    int 
382c0 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
382d0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63   0;.    int forc
382e0 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30  eNewLockPath = 0
382f0 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41  ;.    .    OSTRA
38300 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
38310 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
38320 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
38330 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
38340 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
38350 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
38360 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
38370 75 74 6f 3a 22 29 2c 0a 20 20 20 20 20 20 20 20  uto:"),.        
38380 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29       osGetpid(0)
38390 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72  ));..    rc = pr
383a0 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48  oxyGetHostID(myH
383b0 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b  ostID, &pError);
383c0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
383d0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
383e0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
383f0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
38400 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 67  pError);.      g
38410 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
38420 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  h;.    }.    rc 
38430 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b  = proxyConchLock
38440 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
38450 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
38460 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
38470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
38480 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
38490 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  h;.    }.    /* 
384a0 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e  read the existin
384b0 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  g conch file */.
384c0 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65      readLen = se
384d0 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46  ekAndRead((unixF
384e0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
384f0 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58  0, readBuf, PROX
38500 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a  Y_MAXCONCHLEN);.
38510 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c      if( readLen<
38520 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f  0 ){.      /* I/
38530 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72  O error: lastErr
38540 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
38550 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 73  dRead */.      s
38560 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
38570 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  ile, conchFile->
38580 6c 61 73 74