/ Hex Artifact Content
Login

Artifact bd7df3094a60915c148517504c76df4fca24e542:


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 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61  if../*.** standa
0c30: 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73  rd include files
0c40: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0c50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0c60: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0c70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0c80: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  l.h>.#include <u
0c90: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0ca0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  e <time.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0cd0: 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .h>.#if !defined
0ce0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
0cf0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
0d00: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e  MMAP_SIZE>0.# in
0d10: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e  clude <sys/mman.
0d20: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  h>.#endif..#if S
0d30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0d40: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 4f 53  KING_STYLE || OS
0d50: 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63 6c 75  _VXWORKS.# inclu
0d60: 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e  de <sys/ioctl.h>
0d70: 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  .# if OS_VXWORKS
0d80: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d  .#  include <sem
0d90: 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63  aphore.h>.#  inc
0da0: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0db0: 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64  # else.#  includ
0dc0: 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23  e <sys/file.h>.#
0dd0: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70    include <sys/p
0de0: 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a  aram.h>.# endif.
0df0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
0e00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0e10: 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65  STYLE */..#if de
0e20: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0e30: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42   || (SQLITE_ENAB
0e40: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0e50: 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29   && !OS_VXWORKS)
0e60: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0e70: 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a  mount.h>.#endif.
0e80: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
0e90: 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74  ME.# include <ut
0ea0: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f  ime.h>.#endif../
0eb0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
0ec0: 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e  ues of unixFile.
0ed0: 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  fsFlags.*/.#defi
0ee0: 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  ne SQLITE_FSFLAG
0ef0: 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30  S_IS_MSDOS     0
0f00: 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  x1../*.** If we 
0f10: 61 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64  are to be thread
0f20: 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74  -safe, include t
0f30: 68 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64  he pthreads head
0f40: 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a  er and define.**
0f50: 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58   the SQLITE_UNIX
0f60: 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a  _THREADS macro..
0f70: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
0f80: 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75  READSAFE.# inclu
0f90: 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23  de <pthread.h>.#
0fa0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55   define SQLITE_U
0fb0: 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65  NIX_THREADS 1.#e
0fc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  ndif../*.** Defa
0fd0: 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ult permissions 
0fe0: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
0ff0: 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e  new file.*/.#ifn
1000: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1010: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1020: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1030: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
1040: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34  _PERMISSIONS 064
1050: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
1060: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1070: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1080: 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72  g auto proxy dir
1090: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10a0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
10b0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
10c0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
10d0: 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
10e0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35  _PERMISSIONS 075
10f0: 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  5.#endif../*.** 
1100: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1110: 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a  d path-length..*
1120: 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  /.#define MAX_PA
1130: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a  THNAME 512../*.*
1140: 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c  * Only set the l
1150: 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20  astErrno if the 
1160: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20  error code is a 
1170: 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e  real error and n
1180: 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20  ot .** a normal 
1190: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20  expected return 
11a0: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42  code of SQLITE_B
11b0: 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  USY or SQLITE_OK
11c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c  .*/.#define IS_L
11d0: 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28  OCK_ERROR(x)  ((
11e0: 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  x != SQLITE_OK) 
11f0: 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f  && (x != SQLITE_
1200: 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61  BUSY))../* Forwa
1210: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
1220: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1230: 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b  unixShm unixShm;
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1250: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61  * Connection sha
1260: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red memory */.ty
1270: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1280: 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d  xShmNode unixShm
1290: 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  Node;       /* S
12a0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73  hared memory ins
12b0: 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66  tance */.typedef
12c0: 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64   struct unixInod
12d0: 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49  eInfo unixInodeI
12e0: 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e  nfo;   /* An i-n
12f0: 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ode */.typedef s
1300: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1310: 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b  Fd UnixUnusedFd;
1320: 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65       /* An unuse
1330: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1340: 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  r */../*.** Some
1350: 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66  times, after a f
1360: 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c  ile handle is cl
1370: 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20  osed by SQLite, 
1380: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1390: 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tor.** cannot be
13a0: 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74   closed immediat
13b0: 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61  ely. In these ca
13c0: 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f  ses, instances o
13d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
13e0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65  ** structure are
13f0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1400: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1410: 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67  or while waiting
1420: 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72   for an.** oppor
1430: 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72  tunity to either
1440: 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20   close or reuse 
1450: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e  it..*/.struct Un
1460: 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69  ixUnusedFd {.  i
1470: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
1480: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1490: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63   descriptor to c
14a0: 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  lose */.  int fl
14b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
14c0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69      /* Flags thi
14d0: 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
14e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74  r was opened wit
14f0: 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  h */.  UnixUnuse
1500: 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  dFd *pNext;     
1510: 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20   /* Next unused 
1520: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1530: 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a  on same file */.
1540: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e  };../*.** The un
1550: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
1560: 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20   is subclass of 
1570: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65  sqlite3_file spe
1580: 63 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69  cific to the uni
1590: 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65  x.** VFS impleme
15a0: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70  ntations..*/.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
15c0: 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73  File unixFile;.s
15d0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b  truct unixFile {
15e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
15f0: 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65  thods const *pMe
1600: 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73  thod;  /* Always
1610: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1620: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
1630: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
1640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1650: 20 56 46 53 20 74 68 61 74 20 63 72 65 61 74 65   VFS that create
1660: 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20  d this unixFile 
1670: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1680: 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1690: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
16a0: 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20   about locks on 
16b0: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
16c0: 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16f0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
1700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
1710: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
1720: 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20      /* The type 
1730: 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  of lock held on 
1740: 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73  this fd */.  uns
1750: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
1760: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1770: 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62   /* Behavioral b
1780: 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a  its.  UNIXFILE_*
1790: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
17a0: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e  /* The unix errn
17d0: 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20  o from last I/O 
17e0: 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20  error */.  void 
17f0: 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  *lockingContext;
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1810: 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  * Locking style 
1820: 73 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a  specific state *
1830: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
1840: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
1850: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61          /* Pre-a
1860: 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75  llocated UnixUnu
1870: 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  sedFd */.  const
1880: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20   char *zPath;   
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
18b0: 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
18c0: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18e0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
18f0: 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ment information
1900: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e   */.  int szChun
1910: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1930: 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c  figured by FCNTL
1940: 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23  _CHUNK_SIZE */.#
1950: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1960: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1970: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
19a0: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
19b0: 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  refs */.  sqlite
19c0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19e0: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
19f0: 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52  mapping at pMapR
1a00: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  egion */.  sqlit
1a10: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a  e3_int64 mmapSiz
1a20: 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f  eActual;       /
1a30: 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  * Actual size of
1a40: 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70   mapping at pMap
1a50: 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  Region */.  sqli
1a60: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
1a70: 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20  zeMax;          
1a80: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
1a90: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
1aa0: 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  lue */.  void *p
1ab0: 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  MapRegion;      
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65  Memory mapped re
1ae0: 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  gion */.#endif.#
1af0: 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1b00: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
1b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b20: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
1b30: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   sector size */.
1b40: 20 20 69 6e 74 20 64 65 76 69 63 65 43 68 61 72    int deviceChar
1b50: 61 63 74 65 72 69 73 74 69 63 73 3b 20 20 20 20  acteristics;    
1b60: 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70        /* Precomp
1b70: 75 74 65 64 20 64 65 76 69 63 65 20 63 68 61 72  uted device char
1b80: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23  acteristics */.#
1b90: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1ba0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1bb0: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1bc0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1be0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1bf0: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1c00: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1c10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c20: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1c30: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1c40: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74     /* cached det
1c70: 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73  ails from statfs
1c80: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1c90: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
1ca0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
1cb0: 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20  Id *pId;        
1cc0: 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65    /* Unique file
1cd0: 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69   ID */.#endif.#i
1ce0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cf0: 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  G.  /* The next 
1d00: 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c  group of variabl
1d10: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  es are used to t
1d20: 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20  rack whether or 
1d30: 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  not the.  ** tra
1d40: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1d50: 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20   in bytes 24-27 
1d60: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
1d70: 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20  s are updated.  
1d80: 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20  ** whenever any 
1d90: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1da0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
1db0: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  n assertion faul
1dc0: 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75  t will.  ** occu
1dd0: 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75  r if a file is u
1de0: 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  pdated without a
1df0: 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65  lso updating the
1e00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
1e10: 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  * counter.  This
1e20: 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f   test is made to
1e30: 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c   avoid new probl
1e40: 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  ems similar to t
1e50: 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63  he.  ** one desc
1e60: 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20  ribed by ticket 
1e70: 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75  #3584. .  */.  u
1e80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61  nsigned char tra
1e90: 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a  nsCntrChng;   /*
1ea0: 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61   True if the tra
1eb0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1ec0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
1ed0: 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70  signed char dbUp
1ee0: 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  date;        /* 
1ef0: 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74  True if any part
1f00: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
1f10: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
1f20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e  nsigned char inN
1f30: 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a  ormalWrite;   /*
1f40: 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f   True if in a no
1f50: 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61  rmal write opera
1f60: 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a  tion */..#endif.
1f70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1f80: 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74  EST.  /* In test
1f90: 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20   mode, increase 
1fa0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73  the size of this
1fb0: 20 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74   structure a bit
1fc0: 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69   so that .  ** i
1fd0: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
1fe0: 20 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73   the struct Cras
1ff0: 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e  hFile defined in
2000: 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20   test6.c..  */. 
2010: 20 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33   char aPadding[3
2020: 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  2];.#endif.};../
2030: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
2040: 68 6f 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73  holds the proces
2050: 73 20 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20  s id (pid) from 
2060: 77 68 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d  when the xRandom
2070: 6e 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ness().** method
2080: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66   was called.  If
2090: 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c   xOpen() is call
20a0: 65 64 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72  ed from a differ
20b0: 65 6e 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a  ent process id,.
20c0: 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ** indicating th
20d0: 61 74 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20  at a fork() has 
20e0: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20 50 52  occurred, the PR
20f0: 4e 47 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74  NG will be reset
2100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2110: 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
2120: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  0;../*.** Allowe
2130: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
2140: 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c   unixFile.ctrlFl
2150: 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a  ags bitmask:.*/.
2160: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2170: 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30  _EXCL        0x0
2180: 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  1     /* Connect
2190: 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72  ions from one pr
21a0: 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64  ocess only */.#d
21b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52  efine UNIXFILE_R
21c0: 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20  DONLY      0x02 
21d0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
21e0: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
21f0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2200: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30  LE_PERSIST_WAL 0
2210: 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69  x04     /* Persi
2220: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
2230: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2240: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
2250: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
2260: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2270: 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74  08     /* Direct
2280: 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20  ory sync needed 
2290: 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  */.#else.# defin
22a0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
22b0: 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69  NC    0x00.#endi
22c0: 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  f.#define UNIXFI
22d0: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30  LE_PSOW        0
22e0: 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  x10     /* SQLIT
22f0: 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
2300: 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23  E_OVERWRITE */.#
2310: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2320: 44 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30  DELETE      0x20
2330: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
2340: 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69  n close */.#defi
2350: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20  ne UNIXFILE_URI 
2360: 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20          0x40    
2370: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67   /* Filename mig
2380: 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61  ht have query pa
2390: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66  rameters */.#def
23a0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  ine UNIXFILE_NOL
23b0: 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20  OCK      0x80   
23c0: 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20    /* Do no file 
23d0: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69  locking */.#defi
23e0: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  ne UNIXFILE_WARN
23f0: 45 44 20 20 20 20 30 78 30 31 30 30 20 20 20 20  ED    0x0100    
2400: 20 2f 2a 20 76 65 72 69 66 79 44 62 46 69 6c 65   /* verifyDbFile
2410: 28 29 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65  () warnings have
2420: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
2430: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
2440: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
2450: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
2460: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
2470: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2480: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2490: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
24a0: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
24b0: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
24c0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
24d0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
24e0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
24f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2500: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
2510: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
2520: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2530: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2540: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
2550: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
2560: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
2570: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2580: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2590: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
25a0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
25b0: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
25c0: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
25d0: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
25e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
25f0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2600: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2610: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
2620: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
2630: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
2640: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
2650: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
2660: 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50  *.** HAVE_MREMAP
2670: 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75   defaults to tru
2680: 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66  e on Linux and f
2690: 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20  alse everywhere 
26a0: 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  else..*/.#if !de
26b0: 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41  fined(HAVE_MREMA
26c0: 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28  P).# if defined(
26d0: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
26e0: 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43  fined(_GNU_SOURC
26f0: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  E).#  define HAV
2700: 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73  E_MREMAP 1.# els
2710: 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  e.#  define HAVE
2720: 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69  _MREMAP 0.# endi
2730: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
2740: 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73  Different Unix s
2750: 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f  ystems declare o
2760: 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65  pen() in differe
2770: 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75  nt ways.  Same u
2780: 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74  se.** open(const
2790: 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f   char*,int,mode_
27a0: 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20  t).  Others use 
27b0: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
27c0: 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68  ,int,...)..** Th
27d0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
27e0: 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75  important when u
27f0: 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  sing a pointer t
2800: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  o the function..
2810: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74  **.** The safest
2820: 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74   way to deal wit
2830: 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  h the problem is
2840: 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74   to always use t
2850: 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77  his wrapper.** w
2860: 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20  hich always has 
2870: 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65  the same well-de
2880: 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e  fined interface.
2890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
28a0: 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63  osixOpen(const c
28b0: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
28c0: 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29  flags, int mode)
28d0: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28  {.  return open(
28e0: 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f  zFile, flags, mo
28f0: 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  de);.}../*.** On
2900: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63   some systems, c
2910: 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29  alls to fchown()
2920: 20 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20   will trigger a 
2930: 6d 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63  message in a sec
2940: 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20  urity.** log if 
2950: 74 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e  they come from n
2960: 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65  on-root processe
2970: 73 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c  s.  So avoid cal
2980: 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66  ling fchown() if
2990: 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72  .** we are not r
29a0: 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a  unning as root..
29b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
29c0: 73 69 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64  sixFchown(int fd
29d0: 2c 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64  , uid_t uid, gid
29e0: 5f 74 20 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f  _t gid){.#if OS_
29f0: 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
2a00: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   0;.#else.  retu
2a10: 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f 20 30  rn geteuid() ? 0
2a20: 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75 69 64   : fchown(fd,uid
2a30: 2c 67 69 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ,gid);.#endif.}.
2a40: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
2a50: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
2a60: 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
2a70: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  y(const char*, i
2a80: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
2a90: 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
2aa0: 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  (void);../*.** M
2ab0: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
2ac0: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
2ad0: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
2ae0: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
2af0: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
2b00: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
2b10: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
2b20: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
2b30: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
2b40: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
2b50: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
2b60: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
2b70: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
2b80: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
2b90: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
2ba0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
2bb0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2bc0: 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20  unix_syscall {. 
2bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2be0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2bf0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
2c00: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2c10: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2c20: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
2c30: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
2c40: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
2c50: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
2c60: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
2c70: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
2c80: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
2c90: 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70  ll[] = {.  { "op
2ca0: 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  en",         (sq
2cb0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2cc0: 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20  r)posixOpen,  0 
2cd0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
2ce0: 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  en      ((int(*)
2cf0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2d00: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30  ,int))aSyscall[0
2d10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2d20: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
2d30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2d40: 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20  l_ptr)close,    
2d50: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2d60: 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e  osClose     ((in
2d70: 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61  t(*)(int))aSysca
2d80: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
2d90: 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20  .  { "access",  
2da0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2db0: 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73  scall_ptr)access
2dc0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
2dd0: 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20  ine osAccess    
2de0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
2df0: 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61  har*,int))aSysca
2e00: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
2e10: 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20  .  { "getcwd",  
2e20: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2e30: 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64  scall_ptr)getcwd
2e40: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
2e50: 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20  ine osGetcwd    
2e60: 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a  ((char*(*)(char*
2e70: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
2e80: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
2e90: 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20    { "stat",     
2ea0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2eb0: 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20  call_ptr)stat,  
2ec0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2ed0: 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28  ne osStat      (
2ee0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2ef0: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
2f00: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
2f10: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54  urrent)../*.** T
2f20: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
2f30: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
2f40: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
2f50: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
2f60: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
2f70: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
2f80: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
2f90: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
2fa0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
2fb0: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
2fc0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
2fd0: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
2fe0: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
2ff0: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
3000: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
3010: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
3020: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  fdef __DJGPP__. 
3030: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
3040: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
3050: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
3060: 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c  ine osFstat(a,b,
3070: 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20  c)    0.#else   
3080: 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20    .  { "fstat", 
3090: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
30a0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61  syscall_ptr)fsta
30b0: 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  t,      0  },.#d
30c0: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20  efine osFstat   
30d0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73    ((int(*)(int,s
30e0: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
30f0: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
3100: 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  t).#endif..  { "
3110: 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28  ftruncate",    (
3120: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3130: 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20  ptr)ftruncate,  
3140: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3150: 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28  Ftruncate ((int(
3160: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  *)(int,off_t))aS
3170: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
3180: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22  nt)..  { "fcntl"
3190: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
31a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
31b0: 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ntl,      0  },.
31c0: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
31d0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
31e0: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
31f0: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
3200: 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20  .  { "read",    
3210: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3220: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20  scall_ptr)read, 
3230: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
3240: 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20  ine osRead      
3250: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3260: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  ,void*,size_t))a
3270: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
3280: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3290: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
32a0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
32b0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
32c0: 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 20 20 7b  !OS_VXWORKS).  {
32d0: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
32e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
32f0: 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 20  l_ptr)pread,    
3300: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3310: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3320: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3330: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3340: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3350: 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20  #define osPread 
3360: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3370: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
3380: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3390: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
33a0: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
33b0: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72  PREAD64).  { "pr
33c0: 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71  ead64",      (sq
33d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33e0: 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30 20  r)pread64,    0 
33f0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3400: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
3410: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3420: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3430: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3440: 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20 20  ine osPread64   
3450: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3460: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3470: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30  f_t))aSyscall[10
3480: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3490: 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20 20   "write",       
34a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
34b0: 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20 20  l_ptr)write,    
34c0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
34d0: 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73  osWrite     ((ss
34e0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
34f0: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  st void*,size_t)
3500: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
3510: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3520: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
3530: 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  || (SQLITE_ENABL
3540: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
3550: 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a  && !OS_VXWORKS).
3560: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3570: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3580: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
3590: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
35a0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
35b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35c0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
35d0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
35e0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
35f0: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3600: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3610: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3620: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3630: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3640: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3650: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3660: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3670: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3680: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3690: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
36a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
36b0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
36c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36d0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
36e0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
36f0: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3700: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3710: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3720: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3750: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3760: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
3770: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3780: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
3790: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
37a0: 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28 2a 29  hmod    ((int(*)
37b0: 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79  (int,mode_t))aSy
37c0: 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65  scall[14].pCurre
37d0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
37e0: 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
37f0: 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
3800: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
3810: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
3820: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3830: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f 66 61  all_ptr)posix_fa
3840: 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23  llocate,  0 },.#
3850: 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  else.  { "falloc
3860: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3870: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
38a0: 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20  ine osFallocate 
38b0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
38c0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
38d0: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
38e0: 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20  ..  { "unlink", 
38f0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3900: 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e  yscall_ptr)unlin
3910: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  k,           0 }
3920: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69  ,.#define osUnli
3930: 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  nk    ((int(*)(c
3940: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3950: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
3960: 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72  t)..  { "openDir
3970: 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73 71 6c  ectory",    (sql
3980: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3990: 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 20  )openDirectory, 
39a0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
39b0: 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e osOpenDirector
39c0: 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74  y ((int(*)(const
39d0: 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79   char*,int*))aSy
39e0: 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65  scall[17].pCurre
39f0: 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22  nt)..  { "mkdir"
3a00: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3a10: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b  3_syscall_ptr)mk
3a20: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3a30: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b   },.#define osMk
3a40: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3a50: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64  (const char*,mod
3a60: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 38  e_t))aSyscall[18
3a70: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3a80: 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20 20 20   "rmdir",       
3a90: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3aa0: 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20 20 20  l_ptr)rmdir,    
3ab0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
3ac0: 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20 20 20  ine osRmdir     
3ad0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
3ae0: 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  har*))aSyscall[1
3af0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
3b00: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3b10: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3b20: 6c 6c 5f 70 74 72 29 70 6f 73 69 78 46 63 68 6f  ll_ptr)posixFcho
3b30: 77 6e 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  wn,     0 },.#de
3b40: 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20  fine osFchown   
3b50: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69   ((int(*)(int,ui
3b60: 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63  d_t,gid_t))aSysc
3b70: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3b80: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
3b90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
3ba0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
3bb0: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22  MAP_SIZE>0.  { "
3bc0: 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  mmap",       (sq
3bd0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3be0: 72 29 6d 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c  r)mmap,     0 },
3bf0: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20  .#define osMmap 
3c00: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
3c10: 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c  ,size_t,int,int,
3c20: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3c30: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
3c40: 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c  )..  { "munmap",
3c50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3c60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d  syscall_ptr)munm
3c70: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
3c80: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d  ,.#define osMunm
3c90: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
3ca0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3cb0: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
3cc0: 74 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45  t)..#if HAVE_MRE
3cd0: 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  MAP.  { "mremap"
3ce0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3cf0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65  _syscall_ptr)mre
3d00: 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  map,          0 
3d10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72  },.#else.  { "mr
3d20: 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  emap",       (sq
3d30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3d40: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
3d50: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3d60: 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20  define osMremap 
3d70: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
3d80: 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69  ,size_t,size_t,i
3d90: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
3da0: 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 20  [23].pCurrent). 
3db0: 20 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65 22   { "getpagesize"
3dc0: 2c 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63  ,  (sqlite3_sysc
3dd0: 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74 70  all_ptr)unixGetp
3de0: 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 64  agesize, 0 },.#d
3df0: 65 66 69 6e 65 20 6f 73 47 65 74 70 61 67 65 73  efine osGetpages
3e00: 69 7a 65 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  ize ((int(*)(voi
3e10: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e  d))aSyscall[24].
3e20: 70 43 75 72 72 65 6e 74 29 0a 0a 23 65 6e 64 69  pCurrent)..#endi
3e30: 66 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  f..}; /* End of 
3e40: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
3e50: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
3e60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
3e70: 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61  the xSetSystemCa
3e80: 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73  ll() method of s
3e90: 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61  qlite3_vfs for a
3ea0: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e  ll of the.** "un
3eb0: 69 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  ix" VFSes.  Retu
3ec0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
3ed0: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
3ee0: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
3ef0: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
3f00: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
3f10: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
3f20: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
3f30: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
3f40: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
3f50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
3f60: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xSetSystemCall(.
3f70: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
3f80: 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
3f90: 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74  /* The VFS point
3fa0: 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f  er.  Not used */
3fb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3fc0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
3fd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74   /* Name of syst
3fe0: 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72  em call to overr
3ff0: 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ide */.  sqlite3
4000: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65  _syscall_ptr pNe
4010: 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65  wFunc  /* Pointe
4020: 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20  r to new system 
4030: 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  call value */.){
4040: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4050: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
4060: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a  LITE_NOTFOUND;..
4070: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4080: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
4090: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
40a0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61      /* If no zNa
40b0: 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73  me is given, res
40c0: 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20  tore all system 
40d0: 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64  calls to their d
40e0: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  efault.    ** se
40f0: 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  ttings and retur
4100: 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20  n NULL.    */.  
4110: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
4120: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4130: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4140: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4150: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4160: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4170: 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20  i].pDefault ){. 
4180: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
4190: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53  i].pCurrent = aS
41a0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
41b0: 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  lt;.      }.    
41c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
41d0: 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70  * If zName is sp
41e0: 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65  ecified, operate
41f0: 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65   on only the one
4200: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20   system call.   
4210: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20   ** specified.. 
4220: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
4230: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
4240: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
4250: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
4260: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
4270: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
4280: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
4290: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
42a0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
42b0: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  lt==0 ){.       
42c0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
42d0: 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61  Default = aSysca
42e0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
42f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4300: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
4310: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
4320: 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77  ewFunc==0 ) pNew
4330: 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b  Func = aSyscall[
4340: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4350: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
4360: 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77  .pCurrent = pNew
4370: 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72  Func;.        br
4380: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4390: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
43a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
43b0: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
43c0: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20   a system call. 
43d0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
43e0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a  zName is not a.*
43f0: 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73  * recognized sys
4400: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20  tem call name.  
4410: 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74  NULL is also ret
4420: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73  urned if the sys
4430: 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63  tem call.** is c
4440: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e  urrently undefin
4450: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ed..*/.static sq
4460: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4470: 72 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43  r unixGetSystemC
4480: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
4490: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
44a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
44b0: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
44c0: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
44d0: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
44e0: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
44f0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
4500: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
4510: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
4520: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4530: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4540: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
4550: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
4560: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
4570: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4580: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
4590: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
45a0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
45b0: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
45c0: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
45d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
45e0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
45f0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
4600: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
4610: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
4620: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
4630: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
4640: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
4650: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
4660: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
4670: 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78  st char *unixNex
4680: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
4690: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
46a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
46b0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
46c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
46d0: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
46e0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
46f0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
4700: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
4710: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
4720: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
4730: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
4740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4750: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
4760: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
4770: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
4780: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
4790: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
47a0: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
47b0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
47c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
47d0: 6f 20 6e 6f 74 20 61 63 63 65 70 74 20 61 6e 79  o not accept any
47e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
47f0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 69 73 20   less than this 
4800: 76 61 6c 75 65 2c 20 69 6e 20 6f 72 64 65 72 20  value, in order 
4810: 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e  to avoid.** open
4820: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
4830: 65 20 75 73 69 6e 67 20 66 69 6c 65 20 64 65 73  e using file des
4840: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 61 72  criptors that ar
4850: 65 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20  e commonly used 
4860: 66 6f 72 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64  for .** standard
4870: 20 69 6e 70 75 74 2c 20 6f 75 74 70 75 74 2c 20   input, output, 
4880: 61 6e 64 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69  and error..*/.#i
4890: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e  fndef SQLITE_MIN
48a0: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
48b0: 50 54 4f 52 0a 23 20 64 65 66 69 6e 65 20 53 51  PTOR.# define SQ
48c0: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
48d0: 45 5f 44 45 53 43 52 49 50 54 4f 52 20 33 0a 23  E_DESCRIPTOR 3.#
48e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  endif../*.** Inv
48f0: 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20  oke open().  Do 
4900: 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  so multiple time
4910: 73 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68  s, until it eith
4920: 65 72 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a  er succeeds or.*
4930: 2a 20 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65  * fails for some
4940: 20 72 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68   reason other th
4950: 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20  an EINTR..**.** 
4960: 49 66 20 74 68 65 20 66 69 6c 65 20 63 72 65 61  If the file crea
4970: 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73  tion mode "m" is
4980: 20 30 20 74 68 65 6e 20 73 65 74 20 69 74 20 74   0 then set it t
4990: 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f  o the default fo
49a0: 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68  r.** SQLite.  Th
49b0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c  e default is SQL
49c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
49d0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f  _PERMISSIONS (no
49e0: 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20  rmally.** 0644) 
49f0: 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  as modified by t
4a00: 68 65 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e  he system umask.
4a10: 20 20 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c    If m is not 0,
4a20: 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68   then.** make th
4a30: 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
4a40: 6d 6f 64 65 20 62 65 20 65 78 61 63 74 6c 79 20  mode be exactly 
4a50: 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75  m ignoring the u
4a60: 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mask..**.** The 
4a70: 6d 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  m parameter will
4a80: 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c   be non-zero onl
4a90: 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  y when creating 
4aa0: 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a  -wal, -journal,.
4ab0: 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65  ** and -shm file
4ac0: 73 2e 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73  s.  We want thos
4ad0: 65 20 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20  e files to have 
4ae0: 2a 65 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61  *exactly* the sa
4af0: 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e  me.** permission
4b00: 73 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69  s as their origi
4b10: 6e 61 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e  nal database, un
4b20: 61 64 75 6c 74 65 72 61 74 65 64 20 62 79 20 74  adulterated by t
4b30: 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20  he umask..** In 
4b40: 74 68 61 74 20 77 61 79 2c 20 69 66 20 61 20 64  that way, if a d
4b50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
4b60: 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77  -rw-rw-rw or -rw
4b70: 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a  -rw-r-, and a.**
4b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61   transaction cra
4b90: 73 68 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20  shes and leaves 
4ba0: 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e  behind hot journ
4bb0: 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  als, then any.**
4bc0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 69 73   process that is
4bd0: 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74   able to write t
4be0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  o the database w
4bf0: 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65  ill also be able
4c00: 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74   to.** recover t
4c10: 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e  he hot journals.
4c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4c30: 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74  obust_open(const
4c40: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c   char *z, int f,
4c50: 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e   mode_t m){.  in
4c60: 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d  t fd;.  mode_t m
4c70: 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49  2 = m ? m : SQLI
4c80: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
4c90: 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77  PERMISSIONS;.  w
4ca0: 68 69 6c 65 28 31 29 7b 0a 23 69 66 20 64 65 66  hile(1){.#if def
4cb0: 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a  ined(O_CLOEXEC).
4cc0: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
4cd0: 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32  z,f|O_CLOEXEC,m2
4ce0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66 64 20  );.#else.    fd 
4cf0: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29  = osOpen(z,f,m2)
4d00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
4d10: 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69   fd<0 ){.      i
4d20: 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  f( errno==EINTR 
4d30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4d50: 20 20 20 69 66 28 20 66 64 3e 3d 53 51 4c 49 54     if( fd>=SQLIT
4d60: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
4d70: 45 53 43 52 49 50 54 4f 52 20 29 20 62 72 65 61  ESCRIPTOR ) brea
4d80: 6b 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 28 66  k;.    osClose(f
4d90: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
4da0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
4db0: 4e 47 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  NG, .           
4dc0: 20 20 20 20 20 22 61 74 74 65 6d 70 74 20 74 6f       "attempt to
4dd0: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 61 73 20   open \"%s\" as 
4de0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4df0: 25 64 22 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20  %d", z, fd);.   
4e00: 20 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66   fd = -1;.    if
4e10: 28 20 6f 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e  ( osOpen("/dev/n
4e20: 75 6c 6c 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20  ull", f, m)<0 ) 
4e30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
4e40: 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66   fd>=0 ){.    if
4e50: 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m!=0 ){.      
4e60: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
4e70: 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  buf;.      if( o
4e80: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
4e90: 62 75 66 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  buf)==0 .       
4ea0: 26 26 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  && statbuf.st_si
4eb0: 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  ze==0.       && 
4ec0: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
4ed0: 26 30 37 37 37 29 21 3d 6d 20 0a 20 20 20 20 20  &0777)!=m .     
4ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 46 63   ){.        osFc
4ef0: 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20  hmod(fd, m);.   
4f00: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64     }.    }.#if d
4f10: 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45  efined(FD_CLOEXE
4f20: 43 29 20 26 26 20 28 21 64 65 66 69 6e 65 64 28  C) && (!defined(
4f30: 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f  O_CLOEXEC) || O_
4f40: 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20 20 20 20  CLOEXEC==0).    
4f50: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  osFcntl(fd, F_SE
4f60: 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c  TFD, osFcntl(fd,
4f70: 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
4f80: 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
4f90: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
4fa0: 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  fd;.}../*.** Hel
4fb0: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
4fc0: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
4fd0: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
4fe0: 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
4ff0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
5000: 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
5010: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
5020: 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73  o and.** vxworks
5030: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75  FileId objects u
5040: 73 65 64 20 62 79 20 74 68 69 73 20 66 69 6c 65  sed by this file
5050: 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
5060: 61 79 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64  ay be .** shared
5070: 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
5080: 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
5090: 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65  tion unixMutexHe
50a0: 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
50b0: 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
50c0: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a  e global mutex .
50d0: 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20  ** is held when 
50e0: 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66  required. This f
50f0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
5100: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
5110: 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
5120: 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a  tements. e.g..**
5130: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  .**   unixEnterM
5140: 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
5150: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
5160: 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e  eld() );.**   un
5170: 69 78 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a  ixEnterLeave().*
5180: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
5190: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  ixEnterMutex(voi
51a0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
51b0: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
51c0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
51d0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
51e0: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74  MASTER));.}.stat
51f0: 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76  ic void unixLeav
5200: 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
5210: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5220: 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
5230: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
5240: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
5250: 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
5260: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5270: 20 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65   int unixMutexHe
5280: 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74  ld(void) {.  ret
5290: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
52a0: 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75  x_held(sqlite3Mu
52b0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
52c0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
52d0: 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TER));.}.#endif.
52e0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
52f0: 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
5300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
5310: 55 47 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  UG)./*.** Helper
5320: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
5330: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
5340: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
5350: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
5360: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
5370: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
5380: 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f   represetation o
5390: 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a  f the supplied.*
53a0: 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74  * integer lock-t
53b0: 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ype..*/.static c
53c0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c  onst char *azFil
53d0: 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c  eLock(int eFileL
53e0: 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ock){.  switch( 
53f0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
5400: 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72   case NO_LOCK: r
5410: 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20  eturn "NONE";.  
5420: 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f    case SHARED_LO
5430: 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52  CK: return "SHAR
5440: 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45  ED";.    case RE
5450: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SERVED_LOCK: ret
5460: 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a  urn "RESERVED";.
5470: 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47      case PENDING
5480: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
5490: 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73  ENDING";.    cas
54a0: 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e EXCLUSIVE_LOCK
54b0: 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53  : return "EXCLUS
54c0: 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75  IVE";.  }.  retu
54d0: 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65  rn "ERROR";.}.#e
54e0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
54f0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
5500: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
5510: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
5520: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
5530: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
5540: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
5550: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
5560: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
5570: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
5580: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
5590: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
55a0: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
55b0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
55c0: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
55d0: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
55e0: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
55f0: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
5600: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
5610: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
5620: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
5630: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
5640: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
5650: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
5660: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
5670: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
5680: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
5690: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
56a0: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
56b0: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
56c0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
56d0: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
56e0: 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74  {.    s = osFcnt
56f0: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
5700: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5710: 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e  intf("fcntl unkn
5720: 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  own %d %d %d\n",
5730: 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20   fd, op, s);.   
5740: 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20   return s;.  }. 
5750: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
5760: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_RDLCK ){.    z
5770: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
5780: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
5790: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
57a0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57  {.    zType = "W
57b0: 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  RLCK";.  }else i
57c0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
57d0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  UNLCK ){.    zTy
57e0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
57f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5800: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  t( 0 );.  }.  as
5810: 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63  sert( p->l_whenc
5820: 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20  e==SEEK_SET );. 
5830: 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c   s = osFcntl(fd,
5840: 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64   op, p);.  saved
5850: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
5860: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
5870: 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64  ntf("fcntl %d %d
5880: 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20   %s %s %d %d %d 
5890: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65  %d\n",.     thre
58a0: 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d  adid, fd, zOpNam
58b0: 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70  e, zType, (int)p
58c0: 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  ->l_start, (int)
58d0: 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28  p->l_len,.     (
58e0: 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29  int)p->l_pid, s)
58f0: 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20  ;.  if( s==(-1) 
5900: 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26  && op==F_SETLK &
5910: 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  & (p->l_type==F_
5920: 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79  RDLCK || p->l_ty
5930: 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a  pe==F_WRLCK) ){.
5940: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
5950: 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70   l2;.    l2 = *p
5960: 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ;.    osFcntl(fd
5970: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
5980: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
5990: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
59a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
59b0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
59c0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
59d0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
59e0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
59f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
5a00: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
5a10: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
5a20: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
5a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
5a40: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
5a50: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
5a60: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
5a70: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
5a80: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
5a90: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
5aa0: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
5ab0: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
5ac0: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
5ad0: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
5ae0: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
5af0: 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e  ;.}.#undef osFcn
5b00: 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  tl.#define osFcn
5b10: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
5b20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
5b30: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
5b40: 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61  ** Retry ftrunca
5b50: 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  te() calls that 
5b60: 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54  fail due to EINT
5b70: 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  R.*/.static int 
5b80: 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
5b90: 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f  (int h, sqlite3_
5ba0: 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74  int64 sz){.  int
5bb0: 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
5bc0: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
5bd0: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
5be0: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
5bf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5c10: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
5c20: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
5c30: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
5c40: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
5c50: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
5c60: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
5c70: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
5c80: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
5c90: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
5ca0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
5cb0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
5cc0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
5cd0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
5ce0: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
5cf0: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
5d00: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
5d10: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
5d20: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
5d30: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
5d40: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
5d50: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
5d60: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
5d70: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
5d80: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
5d90: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
5da0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
5db0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
5dc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
5dd0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
5de0: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
5df0: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
5e00: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
5e10: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
5e20: 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20  {.#if 0.  /* At 
5e30: 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63  one point this c
5e40: 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ode was not comm
5e50: 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68  ented out. In th
5e60: 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63  eory, this branc
5e70: 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65  h.  ** should ne
5e80: 76 65 72 20 62 65 20 68 69 74 2c 20 61 73 20 74  ver be hit, as t
5e90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
5ea0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
5eb0: 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20  ed after.  ** a 
5ec0: 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20  locking-related 
5ed0: 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66  function (i.e. f
5ee0: 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65 74 75  cntl()) has retu
5ef0: 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69  rned non-zero wi
5f00: 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  th.  ** the valu
5f10: 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68  e of errno as th
5f20: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5f30: 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d  . Since a system
5f40: 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64   call has failed
5f50: 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f  ,.  ** errno sho
5f60: 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e  uld be non-zero.
5f70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69  .  **.  ** Despi
5f80: 74 65 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e  te this, if errn
5f90: 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f  o really is zero
5fa0: 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74  , we still don't
5fb0: 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a   want to return.
5fc0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20    ** SQLITE_OK. 
5fd0: 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  The system call 
5fe0: 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d  failed, and *som
5ff0: 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  e* SQLite error 
6000: 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70  should be.  ** p
6010: 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b 20 74  ropagated back t
6020: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f  o the caller. Co
6030: 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72  mmenting this br
6040: 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65  anch out means e
6050: 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c  rrno==0.  ** wil
6060: 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  l be handled by 
6070: 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63  the "default:" c
6080: 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  ase below..  */.
6090: 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72    case 0: .    r
60a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
60b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20  .#endif..  case 
60c0: 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45  EAGAIN:.  case E
60d0: 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65  TIMEDOUT:.  case
60e0: 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45   EBUSY:.  case E
60f0: 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f  INTR:.  case ENO
6100: 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61  LCK:  .    /* ra
6110: 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65  ndom NFS retry e
6120: 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72  rror, unless dur
6130: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
6140: 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20  support .     * 
6150: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
6160: 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61  n which it actua
6170: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
6180: 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65  t says */.    re
6190: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
61a0: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41  ;.    .  case EA
61b0: 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41  CCES: .    /* EA
61c0: 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47  CCES is like EAG
61d0: 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69  AIN during locki
61e0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62  ng operations, b
61f0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72  ut not any other
6200: 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20   time*/.    if( 
6210: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6220: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
6230: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  K) || .        (
6240: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
6250: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
6260: 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  CK) || .        
6270: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6280: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6290: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
62a0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
62b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
62c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
62d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
62e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
62f0: 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66   }.    /* else f
6300: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
6310: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
6320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6330: 50 45 52 4d 3b 0a 20 20 20 20 0a 23 69 66 20 45  PERM;.    .#if E
6340: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
6350: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
6360: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
6370: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
6380: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
6390: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
63a0: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
63b0: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
63c0: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
63d0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
63e0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
63f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
6400: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
6410: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
6420: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
6430: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6440: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
6450: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6460: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
6470: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6480: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
6490: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
64a0: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
64b0: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
64c0: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
64d0: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
64e0: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
64f0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
6500: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6520: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
6530: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
6540: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
6550: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
6560: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
6570: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
6580: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
6590: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
65a0: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
65b0: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
65c0: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
65d0: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
65e0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
6640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
6650: 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  in Unique File I
6660: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
6670: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
6680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
6690: 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73  On most versions
66a0: 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e   of unix, we can
66b0: 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49 44   get a unique ID
66c0: 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63   for a file by c
66d0: 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20  oncatenating.** 
66e0: 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65  the device numbe
66f0: 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20  r and the inode 
6700: 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69  number.  But thi
6710: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
6720: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f  on VxWorks..** O
6730: 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69  n VxWorks, a uni
6740: 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74  que file id must
6750: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
6760: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
6770: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ame..**.** A poi
6780: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
6790: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
67a0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
67b0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 0a  an be used as a.
67c0: 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49  ** unique file I
67d0: 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45  D in VxWorks.  E
67e0: 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
67f0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 63  this structure c
6800: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70  ontains.** a cop
6810: 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  y of the canonic
6820: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68  al filename.  Th
6830: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65  ere is also a re
6840: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20  ference count.  
6850: 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75 72  .** The structur
6860: 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77  e is reclaimed w
6870: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6880: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74  f pointers to it
6890: 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72   drops to.** zer
68a0: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  o..**.** There a
68b0: 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61  re never very ma
68c0: 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74  ny files open at
68d0: 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f   one time and lo
68e0: 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  okups are not.**
68f0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63   a performance-c
6900: 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f  ritical path, so
6910: 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e   it is sufficien
6920: 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a  t to put these.*
6930: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20  * structures on 
6940: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  a linked list..*
6950: 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  /.struct vxworks
6960: 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63  FileId {.  struc
6970: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6980: 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74  *pNext;  /* Next
6990: 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68   in a list of th
69a0: 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  em all */.  int 
69b0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
69c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
69d0: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
69e0: 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f  s to this one */
69f0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
6a20: 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  e zCanonicalName
6a30: 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63  [] string */.  c
6a40: 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e  har *zCanonicalN
6a50: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
6a60: 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  Canonical filena
6a70: 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53  me */.};..#if OS
6a80: 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20  _VXWORKS./* .** 
6a90: 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e  All unique filen
6aa0: 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ames are held on
6ab0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68   a linked list h
6ac0: 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  eaded by this.**
6ad0: 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74   variable:.*/.st
6ae0: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
6af0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
6b00: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a  ksFileList = 0;.
6b10: 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20  ./*.** Simplify 
6b20: 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  a filename into 
6b30: 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f  its canonical fo
6b40: 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20  rm.** by making 
6b50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
6b60: 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  anges:.**.**  * 
6b70: 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61  removing any tra
6b80: 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63  iling and duplic
6b90: 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ate /.**  * conv
6ba0: 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73  ert /./ into jus
6bb0: 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  t /.**  * conver
6bc0: 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41  t /A/../ where A
6bd0: 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e   is any simple n
6be0: 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  ame into just /.
6bf0: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72  **.** Changes ar
6c00: 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e  e made in-place.
6c10: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
6c20: 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a   name length..**
6c30: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6c40: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20   filename is in 
6c50: 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75  z[0..n-1].  Retu
6c60: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
6c70: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
6c80: 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  n the simplified
6c90: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
6ca0: 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70   int vxworksSimp
6cb0: 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a  lifyName(char *z
6cc0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
6cd0: 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  i, j;.  while( n
6ce0: 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >1 && z[n-1]=='/
6cf0: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f  ' ){ n--; }.  fo
6d00: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
6d10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
6d20: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
6d30: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  f( z[i+1]=='/' )
6d40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6d50: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
6d60: 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69   && i+2<n && z[i
6d70: 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
6d80: 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20      i += 1;.    
6d90: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6da0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6db0: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
6dc0: 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +3<n && z[i+2]==
6dd0: 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27  '.' && z[i+3]=='
6de0: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  /' ){.        wh
6df0: 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d  ile( j>0 && z[j-
6e00: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
6e10: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
6e20: 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  0 ){ j--; }.    
6e30: 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
6e40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6e50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6e60: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
6e70: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
6e80: 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a   return j;.}../*
6e90: 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75  .** Find a uniqu
6ea0: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68  e file ID for th
6eb0: 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65  e given absolute
6ec0: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
6ed0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
6ee0: 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  to the vxworksFi
6ef0: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68  leId object.  Th
6f00: 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68  is pointer is th
6f10: 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65  e unique.** file
6f20: 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ID..**.** The n
6f30: 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Ref field of the
6f40: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6f50: 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65  bject is increme
6f60: 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  nted before.** t
6f70: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  he object is ret
6f80: 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78  urned.  A new vx
6f90: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
6fa0: 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  ct is created.**
6fb0: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
6fc0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66  e global list if
6fd0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
6fe0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
6ff0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
7000: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
7010: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  LL..*/.static st
7020: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7030: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46  Id *vxworksFindF
7040: 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72  ileId(const char
7050: 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29   *zAbsoluteName)
7060: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
7070: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20  ksFileId *pNew; 
7080: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63          /* searc
7090: 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69  h key and new fi
70a0: 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63  le ID */.  struc
70b0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
70c0: 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f  *pCandidate;   /
70d0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
70e0: 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  er existing file
70f0: 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b   IDs */.  int n;
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7120: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f   Length of zAbso
7130: 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20  luteName string 
7140: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41  */..  assert( zA
7150: 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d  bsoluteName[0]==
7160: 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e  '/' );.  n = (in
7170: 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75  t)strlen(zAbsolu
7180: 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20  teName);.  pNew 
7190: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
71a0: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
71b0: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
71c0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
71d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
71e0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
71f0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
7200: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
7210: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
7220: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
7230: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
7240: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
7250: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7260: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
7270: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
7280: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
7290: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
72a0: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
72b0: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
72c0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
72d0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
72e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
72f0: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
7300: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
7310: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7320: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
7330: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
7340: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
7350: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
7360: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
7370: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
7380: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
7390: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
73a0: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
73b0: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
73c0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
73d0: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
73e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
73f0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
7400: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
7410: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
7420: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
7430: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
7440: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
7450: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
7460: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
7470: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
7480: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
7490: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
74a0: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
74b0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
74c0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
74d0: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
74e0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
74f0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
7500: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
7510: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
7520: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
7530: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
7540: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7550: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
7560: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
7570: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
7580: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
7590: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
75a0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
75b0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
75c0: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
75d0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
75e0: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
75f0: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
7600: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
7610: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
7620: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7630: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
7640: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
7650: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
7660: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
7670: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
7680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
7690: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
76a0: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
76b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
76c0: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
76d0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
76e0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
76f0: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
7700: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
7710: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
7720: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
7730: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
7740: 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 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 2f 0a 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7800: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
7810: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
7820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
7840: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
7850: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
7860: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
7870: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
7880: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
7890: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
78a0: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
78b0: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
78c0: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
78d0: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
78e0: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
78f0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
7900: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
7910: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
7920: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
7930: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
7940: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
7950: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
7960: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
7970: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
7980: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
7990: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
79a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
79b0: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
79c0: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
79d0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
79e0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
79f0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
7a00: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
7a10: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
7a20: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
7a30: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
7a40: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
7a50: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
7a60: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
7a70: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
7a80: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
7a90: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
7aa0: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
7ab0: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
7ac0: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
7ad0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
7ae0: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
7af0: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
7b00: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
7b10: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
7b20: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
7b30: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
7b40: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
7b50: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
7b60: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
7b70: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
7b80: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
7b90: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
7ba0: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
7bb0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
7bc0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
7bd0: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
7be0: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
7bf0: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
7c00: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
7c10: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
7c20: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
7c30: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
7c40: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
7c50: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
7c60: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
7c70: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
7c80: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
7c90: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
7ca0: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
7cb0: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
7cc0: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
7cd0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
7ce0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
7cf0: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
7d00: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
7d10: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
7d20: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
7d30: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
7d40: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
7d50: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
7d60: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
7d70: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
7d80: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
7d90: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
7da0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
7db0: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
7dc0: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
7dd0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
7de0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7df0: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
7e00: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7e10: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
7e20: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
7e30: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
7e40: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
7e50: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
7e60: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
7e70: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
7e80: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
7e90: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
7ea0: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
7eb0: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
7ec0: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
7ed0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
7ee0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
7ef0: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
7f00: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
7f10: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
7f20: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
7f30: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
7f40: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
7f50: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
7f60: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
7f70: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
7f80: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
7f90: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
7fa0: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
7fb0: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
7fc0: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
7fd0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
7fe0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
7ff0: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
8000: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
8010: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
8020: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
8030: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
8040: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
8050: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
8060: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8070: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
8080: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
8090: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
80a0: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
80b0: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
80c0: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
80d0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
80e0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
80f0: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
8100: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
8110: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
8120: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
8130: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
8140: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
8150: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
8160: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
8170: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
8180: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
8190: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
81a0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
81b0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
81c0: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
81d0: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
81e0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
81f0: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
8200: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
8210: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
8220: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
8230: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
8240: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
8250: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
8260: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
8270: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
8280: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
8290: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
82a0: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
82b0: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
82c0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
82d0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
82e0: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
82f0: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
8300: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
8310: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
8320: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
8330: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
8340: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
8350: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
8360: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
8370: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
8380: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
8390: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
83a0: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
83b0: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
83c0: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
83d0: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
83e0: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
83f0: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
8400: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
8410: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
8420: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
8430: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
8440: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
8450: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
8460: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
8470: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
8480: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
8490: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
84a0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
84b0: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
84c0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
84d0: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
84e0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
84f0: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
8500: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
8510: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
8520: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
8530: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
8540: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
8550: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
8560: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
8570: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
8580: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
8590: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
85a0: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
85b0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
85c0: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
85d0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
85e0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
85f0: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
8600: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
8610: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
8620: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
8630: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
8640: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
8650: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
8660: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
8670: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
8680: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
8690: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
86a0: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
86b0: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
86c0: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
86d0: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
86e0: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
86f0: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
8700: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
8710: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
8720: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
8730: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
8740: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
8750: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
8760: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
8770: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
8780: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
8790: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
87a0: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
87b0: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
87c0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
87d0: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
87e0: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
87f0: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
8800: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
8810: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
8820: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
8830: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
8840: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
8850: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
8860: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
8870: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
8880: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
8890: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
88a0: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
88b0: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
88c0: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
88d0: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
88e0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
88f0: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
8900: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
8910: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
8920: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
8930: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
8940: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
8950: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
8960: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
8970: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
8980: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
8990: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
89a0: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
89b0: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
89c0: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
89d0: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
89e0: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
89f0: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
8a00: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
8a10: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
8a20: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
8a30: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
8a40: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
8a50: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
8a60: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
8a70: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
8a80: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
8a90: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
8aa0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
8ab0: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
8ac0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
8ad0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
8ae0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
8af0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
8b00: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
8b10: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
8b20: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
8b30: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
8b40: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
8b50: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
8b60: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b80: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
8b90: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
8ba0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
8bb0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
8bc0: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
8bd0: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
8be0: 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e  #else.  ino_t in
8bf0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
8c00: 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d      /* Inode num
8c10: 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ber */.#endif.};
8c20: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
8c30: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
8c40: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
8c50: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
8c60: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
8c70: 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75  de.  Or, on Linu
8c80: 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20  xThreads, there 
8c90: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  is one of these 
8ca0: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a  structures for.*
8cb0: 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65  * each inode ope
8cc0: 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65  ned by each thre
8cd0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  ad..**.** A sing
8ce0: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
8cf0: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
8d00: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
8d10: 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a  each unixFile.**
8d20: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
8d30: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
8d40: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
8d50: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
8d60: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
8d70: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
8d80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
8d90: 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20  ixFile pointing 
8da0: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
8db0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b   unixInodeInfo {
8dc0: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
8dd0: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
8de0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
8df0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53   key */.  int nS
8e00: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20  hared;          
8e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8e20: 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f  ber of SHARED lo
8e30: 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e  cks held */.  un
8e40: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
8e50: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  eLock;        /*
8e60: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
8e70: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
8e80: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73  CK etc. */.  uns
8e90: 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63  igned char bProc
8ea0: 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  essLock;     /* 
8eb0: 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f  An exclusive pro
8ec0: 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c  cess lock is hel
8ed0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  d */.  int nRef;
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8f00: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
8f10: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8f20: 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
8f30: 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
8f40: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
8f50: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
8f60: 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20  with this inode 
8f70: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20  */.  int nLock; 
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8fa0: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69  f outstanding fi
8fb0: 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e  le locks */.  Un
8fc0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
8fd0: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sed;          /*
8fe0: 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   Unused file des
8ff0: 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73  criptors to clos
9000: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
9010: 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20  Info *pNext;    
9020: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
9030: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
9040: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  nfo objects */. 
9050: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9060: 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  pPrev;          
9070: 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62   /*    .... doub
9080: 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66  ly linked */.#if
9090: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
90a0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75  OCKING_STYLE.  u
90b0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
90c0: 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f  g sharedByte;  /
90d0: 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61  * for AFP simula
90e0: 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ted shared lock 
90f0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
9100: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
9110: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
9120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
9130: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
9140: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
9150: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
9160: 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65  AME+2];  /* Name
9170: 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f   of that semapho
9180: 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  re */.#endif.};.
9190: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f  ./*.** A lists o
91a0: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
91b0: 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  nfo objects..*/.
91c0: 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65  static unixInode
91d0: 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20  Info *inodeList 
91e0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  = 0;../*.**.** T
91f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75  his function - u
9200: 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c  nixLogError_x(),
9210: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
9220: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
9230: 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72  ro.** unixLogErr
9240: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  or()..**.** It i
9250: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
9260: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
9270: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
9280: 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20  n and errno has 
9290: 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20  been.** set. It 
92a0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
92b0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
92c0: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
92d0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
92e0: 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c  of.** errno and,
92f0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
9300: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
9310: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
9320: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a   strerror() or.*
9330: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  * strerror_r()..
9340: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
9350: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
9360: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
9370: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
9380: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
9390: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
93a0: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
93b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
93c0: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
93d0: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
93e0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
93f0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
9400: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
9410: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
9420: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67  t.** failed (e.g
9430: 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65  . "unlink", "ope
9440: 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f  n") and the asso
9450: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
9460: 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61  em path,.** if a
9470: 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75  ny..*/.#define u
9480: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  nixLogError(a,b,
9490: 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  c)     unixLogEr
94a0: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
94b0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
94c0: 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f   int unixLogErro
94d0: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
94e0: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
94f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
9500: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
9510: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9520: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
9530: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
9540: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
9550: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
9560: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9580: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
9590: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
95a0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
95d0: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
95e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
95f0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
9600: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
9610: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61          /* Messa
9620: 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  ge from strerror
9630: 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  () or equivalent
9640: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f   */.  int iErrno
9650: 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20   = errno;       
9660: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73        /* Saved s
9670: 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d  yscall error num
9680: 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ber */..  /* If 
9690: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68  this is not a th
96a0: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28  readsafe build (
96b0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
96c0: 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a  E==0), then use.
96d0: 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f    ** the strerro
96e0: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
96f0: 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e  obtain the human
9700: 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20  -readable error 
9710: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75  message.  ** equ
9720: 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f  ivalent to errno
9730: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
9740: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20   strerror_r().. 
9750: 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f   */ .#if SQLITE_
9760: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
9770: 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52  fined(HAVE_STRER
9780: 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45  ROR_R).  char aE
9790: 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74  rr[80];.  memset
97a0: 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (aErr, 0, sizeof
97b0: 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20  (aErr));.  zErr 
97c0: 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66  = aErr;..  /* If
97d0: 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52   STRERROR_R_CHAR
97e0: 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63  _P (set by autoc
97f0: 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20  onf scripts) or 
9800: 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66  __USE_GNU is def
9810: 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d  ined,.  ** assum
9820: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
9830: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47  m provides the G
9840: 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74  NU version of st
9850: 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a  rerror_r() that.
9860: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
9870: 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
9880: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
9890: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
98a0: 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20   That pointer . 
98b0: 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   ** may point to
98c0: 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d   aErr[], or it m
98d0: 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ay point to some
98e0: 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20   static storage 
98f0: 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a  somewhere. .  **
9900: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
9910: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
9920: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
9930: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66  POSIX version of
9940: 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f   .  ** strerror_
9950: 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79  r(), which alway
9960: 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f  s writes an erro
9970: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61  r message into a
9980: 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Err[]..  **.  **
9990: 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63   If the code inc
99a0: 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73  orrectly assumes
99b0: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
99c0: 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68  POSIX version th
99d0: 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c  at is.  ** avail
99e0: 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20  able, the error 
99f0: 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74  message will oft
9a00: 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  en be an empty s
9a10: 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a  tring. Not a.  *
9a20: 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20  * huge problem. 
9a30: 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63  Incorrectly conc
9a40: 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20  luding that the 
9a50: 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61  GNU version is a
9a60: 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63  vailable .  ** c
9a70: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73  ould lead to a s
9a80: 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a  egfault though..
9a90: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
9aa0: 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52  (STRERROR_R_CHAR
9ab0: 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  _P) || defined(_
9ac0: 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72  _USE_GNU).  zErr
9ad0: 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74   = .# endif.  st
9ae0: 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c  rerror_r(iErrno,
9af0: 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45   aErr, sizeof(aE
9b00: 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53  rr)-1);..#elif S
9b10: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
9b20: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
9b30: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9b40: 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72  , but strerror_r
9b50: 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
9b60: 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  ble. */.  zErr =
9b70: 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   "";.#else.  /* 
9b80: 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62  Non-threadsafe b
9b90: 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72  uild, use strerr
9ba0: 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  or(). */.  zErr 
9bb0: 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e  = strerror(iErrn
9bc0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
9bd0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
9be0: 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74  th = "";.  sqlit
9bf0: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
9c00: 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63        "os_unix.c
9c10: 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29  :%d: (%d) %s(%s)
9c20: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
9c30: 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75  ine, iErrno, zFu
9c40: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a  nc, zPath, zErr.
9c50: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
9c60: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
9c70: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   Close a file de
9c80: 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
9c90: 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63  We assume that c
9ca0: 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c  lose() almost al
9cb0: 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63  ways works, sinc
9cc0: 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20  e it is only in 
9cd0: 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61  a.** very sick a
9ce0: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e  pplication or on
9cf0: 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61   a very sick pla
9d00: 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69  tform that it mi
9d10: 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20  ght fail..** If 
9d20: 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69  it does fail, si
9d30: 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69  mply leak the fi
9d40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62  le descriptor, b
9d50: 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a  ut do log the.**
9d60: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   error..**.** No
9d70: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
9d80: 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20  t safe to retry 
9d90: 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49  close() after EI
9da0: 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  NTR since the.**
9db0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9dc0: 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65   might have alre
9dd0: 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20  ady been reused 
9de0: 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  by another threa
9df0: 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27  d..** So we don'
9e00: 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65  t even try to re
9e10: 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49  cover from an EI
9e20: 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74  NTR.  Just log t
9e30: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20  he error.** and 
9e40: 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  move on..*/.stat
9e50: 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63  ic void robust_c
9e60: 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  lose(unixFile *p
9e70: 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74  File, int h, int
9e80: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
9e90: 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20  osClose(h) ){.  
9ea0: 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74    unixLogErrorAt
9eb0: 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52  Line(SQLITE_IOER
9ec0: 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22  R_CLOSE, "close"
9ed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9ee0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f           pFile ?
9ef0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20   pFile->zPath : 
9f00: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
9f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
9f20: 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ll file descript
9f30: 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69  ors accumuated i
9f40: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
9f50: 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  nfo->pUnused lis
9f60: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
9f70: 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46  id closePendingF
9f80: 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ds(unixFile *pFi
9f90: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
9fa0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
9fb0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
9fc0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b  UnixUnusedFd *p;
9fd0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
9fe0: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
9ff0: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
a000: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
a010: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
a020: 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  xt;.    robust_c
a030: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66  lose(pFile, p->f
a040: 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
a050: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a060: 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  );.  }.  pInode-
a070: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
a080: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
a090: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
a0a0: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
a0b0: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
a0c0: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
a0d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
a0e0: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
a0f0: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
a100: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
a110: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
a120: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
a130: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
a140: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a150: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78  seInodeInfo(unix
a160: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
a170: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
a180: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
a190: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
a1a0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
a1b0: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
a1c0: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
a1d0: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
a1e0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
a1f0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
a200: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
a210: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
a220: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
a230: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
a240: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
a250: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
a260: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
a270: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
a280: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
a290: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
a2a0: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
a2b0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
a2c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
a2d0: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
a2e0: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
a2f0: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
a300: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
a310: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
a320: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
a330: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a340: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
a350: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
a360: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
a370: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
a380: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
a390: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a3a0: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
a3b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a3c0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
a3d0: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
a3e0: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
a3f0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
a400: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
a410: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
a420: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
a430: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
a440: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
a450: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
a460: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
a470: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
a480: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
a490: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
a4a0: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
a4b0: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
a4c0: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
a4d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
a4e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
a4f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
a500: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
a510: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
a520: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
a530: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
a540: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
a550: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
a560: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
a570: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
a580: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
a590: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
a5a0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
a5b0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a5c0: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
a5d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
a600: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
a610: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
a640: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
a650: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
a660: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
a670: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
a680: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
a690: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
a6a0: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
a6b0: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
a6c0: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
a6d0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
a6e0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a6f0: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
a700: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
a710: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a720: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
a730: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
a740: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
a750: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
a760: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
a770: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
a780: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
a790: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
a7a0: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
a7b0: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
a7c0: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46  e->h;.  rc = osF
a7d0: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
a7e0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
a7f0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
a800: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
a810: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
a820: 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  W.    if( pFile-
a830: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
a840: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
a850: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
a860: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
a870: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
a880: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
a890: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
a8a0: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
a8b0: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
a8c0: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
a8d0: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
a8e0: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
a8f0: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
a900: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
a910: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
a920: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
a930: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
a940: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
a950: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
a960: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
a970: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
a980: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
a990: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
a9a0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
a9b0: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
a9c0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
a9d0: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
a9e0: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
a9f0: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
aa00: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
aa10: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
aa20: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
aa30: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
aa40: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
aa50: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
aa60: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
aa70: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
aa80: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
aa90: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
aaa0: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
aab0: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
aac0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
aad0: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
aae0: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
aaf0: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
ab00: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
ab10: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
ab20: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
ab30: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
ab40: 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65  do{ rc = osWrite
ab50: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77  (fd, "S", 1); }w
ab60: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
ab70: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
ab80: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
ab90: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
aba0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
abb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
abc0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
abd0: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
abe0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
abf0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
ac00: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
ac10: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
ac20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ac30: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
ac40: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
ac50: 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20  memset(&fileId, 
ac60: 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  0, sizeof(fileId
ac70: 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76  ));.  fileId.dev
ac80: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
ac90: 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  v;.#if OS_VXWORK
aca0: 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d  S.  fileId.pId =
acb0: 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c   pFile->pId;.#el
acc0: 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20  se.  fileId.ino 
acd0: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
ace0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64  ;.#endif.  pInod
acf0: 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
ad00: 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
ad10: 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64  & memcmp(&fileId
ad20: 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  , &pInode->fileI
ad30: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
ad40: 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  )) ){.    pInode
ad50: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
ad60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f  ;.  }.  if( pIno
ad70: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  de==0 ){.    pIn
ad80: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
ad90: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
ada0: 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28  node) );.    if(
adb0: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
adc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
add0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
ade0: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
adf0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
ae00: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
ae10: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
ae20: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
ae30: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
ae40: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
ae50: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
ae60: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
ae70: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
ae80: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
ae90: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
aea0: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
aeb0: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
aec0: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
aed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
aee0: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
aef0: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
af00: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
af10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
af20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
af30: 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e  f pFile has been
af40: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
af50: 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61  nked since it wa
af60: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a  s first opened..
af70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
af80: 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46  leHasMoved(unixF
af90: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66  ile *pFile){.#if
afa0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65   OS_VXWORKS.  re
afb0: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  turn pFile->pIno
afc0: 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e  de!=0 && pFile->
afd0: 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  pId!=pFile->pIno
afe0: 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a  de->fileId.pId;.
aff0: 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73  #else.  struct s
b000: 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72  tat buf;.  retur
b010: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
b020: 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53  =0 &&.      (osS
b030: 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  tat(pFile->zPath
b040: 2c 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62 75  , &buf)!=0 || bu
b050: 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d  f.st_ino!=pFile-
b060: 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  >pInode->fileId.
b070: 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ino);.#endif.}..
b080: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75  ./*.** Check a u
b090: 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20  nixFile that is 
b0a0: 61 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72  a database.  Ver
b0b0: 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ify the followin
b0c0: 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65  g:.**.** (1) The
b0d0: 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
b0e0: 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74  e hard link on t
b0f0: 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54  he file.** (2) T
b100: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
b110: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a   symbolic link.*
b120: 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68  * (3) The file h
b130: 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61  as not been rena
b140: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a  med or unlinked.
b150: 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69  **.** Issue sqli
b160: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b170: 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73  ARNING,...) mess
b180: 61 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67  ages if anything
b190: 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a   is not right..*
b1a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65  /.static void ve
b1b0: 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46  rifyDbFile(unixF
b1c0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73  ile *pFile){.  s
b1d0: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
b1e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
b1f0: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
b200: 20 26 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e   & UNIXFILE_WARN
b210: 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  ED ){.    /* One
b220: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
b230: 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e  following warnin
b240: 67 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  gs have already 
b250: 62 65 65 6e 20 69 73 73 75 65 64 2e 20 20 44 6f  been issued.  Do
b260: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 72 65 70 65   not.    ** repe
b270: 61 74 20 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f  at them so as no
b280: 74 20 74 6f 20 63 6c 75 74 74 65 72 20 74 68 65  t to clutter the
b290: 20 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20   error log */.  
b2a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b2b0: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69  rc = osFstat(pFi
b2c0: 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
b2d0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
b2e0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b2f0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61  ITE_WARNING, "ca
b300: 6e 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66 69  nnot fstat db fi
b310: 6c 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  le %s", pFile->z
b320: 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
b330: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
b340: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a  NIXFILE_WARNED;.
b350: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b360: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
b370: 6e 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  nk==0 && (pFile-
b380: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b390: 58 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30  XFILE_DELETE)==0
b3a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b3b0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b3c0: 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b  NG, "file unlink
b3d0: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25  ed while open: %
b3e0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
b3f0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  );.    pFile->ct
b400: 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
b410: 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20  ILE_WARNED;.    
b420: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b430: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31  ( buf.st_nlink>1
b440: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b450: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b460: 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69  NG, "multiple li
b470: 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22  nks to file: %s"
b480: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b490: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
b4a0: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
b4b0: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
b4c0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b4d0: 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
b4e0: 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  le) ){.    sqlit
b4f0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b500: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e  RNING, "file ren
b510: 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  amed while open:
b520: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b530: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b540: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b550: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b560: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
b570: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b580: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
b590: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
b5a0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
b5b0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
b5c0: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
b5d0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
b5e0: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
b5f0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
b600: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
b610: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
b620: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
b630: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
b640: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
b650: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
b660: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
b670: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
b680: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
b690: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
b6a0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
b6b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
b6c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
b6d0: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
b6e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b6f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
b700: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
b710: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b720: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
b730: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b740: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
b750: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b760: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
b770: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
b780: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
b790: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
b7a0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
b7b0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
b7c0: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
b7d0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
b7e0: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
b7f0: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
b800: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
b810: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
b820: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
b830: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
b840: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
b850: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
b860: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
b870: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
b880: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
b890: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
b8a0: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
b8b0: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
b8c0: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
b8d0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
b8e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
b8f0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
b900: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b910: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
b920: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
b930: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
b940: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
b950: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
b960: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
b970: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
b980: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
b990: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
b9a0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  DLOCK;.      pFi
b9b0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b9c0: 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  errno;.    } els
b9d0: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
b9e0: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
b9f0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
ba00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
ba10: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
ba20: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
ba30: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
ba40: 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69  CK %d %d %d (uni
ba50: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
ba60: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
ba70: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
ba80: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
ba90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
baa0: 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20  ttempt to set a 
bab0: 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74  system-lock on t
bac0: 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20  he file pFile.  
bad0: 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  The lock is .** 
bae0: 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f  described by pLo
baf0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
bb00: 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65   pFile was opene
bb10: 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f  d read/write fro
bb20: 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65  m unix-excl, the
bb30: 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a  n the only lock.
bb40: 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64  ** ever obtained
bb50: 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65   is an exclusive
bb60: 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73   lock, and it is
bb70: 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c   obtained exactl
bb80: 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69  y once.** the fi
bb90: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
bba0: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
bbb0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
bbc0: 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a  system locking.*
bbd0: 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63  * operations bec
bbe0: 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63  ome no-ops.  Loc
bbf0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  king operations 
bc00: 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74  still happen int
bc10: 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f  ernally,.** in o
bc20: 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61  rder to coordina
bc30: 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65  te access betwee
bc40: 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62  n separate datab
bc50: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
bc60: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70  ** within this p
bc70: 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20  rocess, but all 
bc80: 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c  of that is handl
bc90: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64  ed in memory and
bca0: 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e   the.** operatin
bcb0: 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  g system does no
bcc0: 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a  t participate..*
bcd0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
bce0: 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72  on is a pass-thr
bcf0: 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f  ough to fcntl(F_
bd00: 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20  SETLK) if pFile 
bd10: 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20  is using.** any 
bd20: 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22  VFS other than "
bd30: 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66  unix-excl" or if
bd40: 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64   pFile is opened
bd50: 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a   on "unix-excl".
bd60: 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f  ** and is read-o
bd70: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  nly..**.** Zero 
bd80: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
bd90: 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65  he call complete
bda0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
bdb0: 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a  or -1 if a call.
bdc0: 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61  ** to fcntl() fa
bdd0: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
bde0: 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20  e, errno is set 
bdf0: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62  appropriately (b
be00: 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73  y fcntl())..*/.s
be10: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
be20: 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  leLock(unixFile 
be30: 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66  *pFile, struct f
be40: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  lock *pLock){.  
be50: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e  int rc;.  unixIn
be60: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
be70: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
be80: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
be90: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
bea0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
beb0: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69  0 );.  if( ((pFi
bec0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
bed0: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d  UNIXFILE_EXCL)!=
bee0: 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72  0 || pInode->bPr
bef0: 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26  ocessLock).   &&
bf00: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
bf10: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
bf20: 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a  DONLY)==0).  ){.
bf30: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
bf40: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
bf50: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
bf60: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
bf70: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
bf80: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ->nLock==0 );.  
bf90: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
bfa0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
bfb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
bfc0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
bfd0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
bfe0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
bff0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
c000: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
c010: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
c020: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
c030: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
c040: 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74    if( rc<0 ) ret
c050: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49  urn rc;.      pI
c060: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
c070: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ck = 1;.      pI
c080: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c0a0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
c0b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
c0c0: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
c0d0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b  , F_SETLK, pLock
c0e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c0f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
c100: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
c110: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
c120: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
c130: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
c140: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
c150: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
c160: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
c170: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
c180: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
c190: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
c1a0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
c1b0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
c1c0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
c1d0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
c1e0: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
c1f0: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
c200: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
c210: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
c220: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
c230: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
c240: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
c250: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
c260: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
c270: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
c280: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
c290: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
c2a0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
c2b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
c2c0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
c2d0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
c2e0: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
c2f0: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
c300: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
c310: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
c320: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
c330: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
c340: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
c350: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
c360: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
c370: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
c380: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
c390: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
c3a0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
c3b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c3c0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
c3d0: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
c3e0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
c3f0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
c400: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
c410: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
c420: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
c430: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
c440: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
c450: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
c460: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
c470: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
c480: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
c490: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
c4a0: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
c4b0: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
c4c0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
c4d0: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
c4e0: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
c4f0: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
c500: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
c510: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
c520: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
c530: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
c540: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
c550: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
c560: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
c570: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
c580: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
c590: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
c5a0: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20  windows systems 
c5b0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
c5c0: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
c5d0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
c5e0: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
c5f0: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
c600: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
c610: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
c620: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
c630: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
c640: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
c650: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
c660: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
c670: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
c680: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
c690: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
c6a0: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
c6b0: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
c6c0: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
c6d0: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
c6e0: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
c6f0: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
c700: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
c710: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
c720: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
c730: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
c740: 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f  cessful, a rando
c750: 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20  m byte from the 
c760: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
c770: 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64  * range' is read
c780: 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  -locked and the 
c790: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
c7a0: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
c7b0: 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  sed..  **.  ** A
c7c0: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
c7d0: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
c7e0: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
c7f0: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
c800: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
c810: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
c820: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
c830: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
c840: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
c850: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
c860: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
c870: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
c880: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
c890: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
c8a0: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
c8b0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
c8c0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
c8d0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
c8e0: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
c8f0: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
c900: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
c910: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
c920: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
c930: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
c940: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
c950: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
c960: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
c970: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
c980: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
c990: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
c9a0: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
c9b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
c9c0: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
c9d0: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
c9e0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
c9f0: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
ca00: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
ca10: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
ca20: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
ca30: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
ca40: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
ca50: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
ca60: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
ca70: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
ca80: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
ca90: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
caa0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
cab0: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
cac0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
cad0: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
cae0: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
caf0: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
cb00: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
cb10: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
cb20: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
cb30: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
cb40: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
cb50: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cb60: 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  se. .  **.  ** T
cb70: 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67  he reason a sing
cb80: 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62  le byte cannot b
cb90: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
cba0: 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  f the 'shared by
cbb0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
cbc0: 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  s that some vers
cbd0: 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20  ions of windows 
cbe0: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72  do not support r
cbf0: 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20  ead-locks. By.  
cc00: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e  ** locking a ran
cc10: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20  dom byte from a 
cc20: 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e  range, concurren
cc30: 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d  t SHARED locks m
cc40: 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76  ay exist.  ** ev
cc50: 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e  en if the lockin
cc60: 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64  g primitive used
cc70: 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69   is always a wri
cc80: 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  te-lock..  */.  
cc90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cca0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
ccb0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
ccc0: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
ccd0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
cce0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
ccf0: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
cd00: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
cd10: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
cd20: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
cd30: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
cd40: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
cd50: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
cd60: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
cd70: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
cd80: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
cd90: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
cda0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
cdb0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
cdc0: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
cdd0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
cde0: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
cdf0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
ce00: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
ce10: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
ce20: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
ce30: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
ce40: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
ce50: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
ce60: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
ce70: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
ce80: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
ce90: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cea0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
ceb0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
cec0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
ced0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cee0: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
cef0: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
cf00: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
cf20: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
cf30: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
cf40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
cf50: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
cf60: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
cf70: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
cf80: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
cf90: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
cfa0: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
cfb0: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
cfc0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
cfd0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
cfe0: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
cff0: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
d000: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
d010: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
d020: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
d030: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
d040: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
d050: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
d060: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
d070: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
d080: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d090: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
d0a0: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
d0b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
d0c0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
d0d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
d0e0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d0f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d100: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
d110: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d120: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d130: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d140: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d150: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d160: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d170: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d180: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d190: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d1a0: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d1b0: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d1c0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d1d0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d1e0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d1f0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d210: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d220: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d230: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d240: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d250: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d260: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d270: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d280: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d290: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d2a0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d2b0: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d2c0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d2d0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d2e0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d2f0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d300: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d310: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d320: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d330: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d340: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d350: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d360: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d370: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d380: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d390: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d3a0: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d3b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d3c0: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d3d0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d3e0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d3f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d400: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d410: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d420: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d430: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d440: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d450: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d460: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d470: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d480: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d490: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d4a0: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d4b0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d4c0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d4d0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d4e0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d4f0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d500: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d510: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d520: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d530: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d540: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d550: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d560: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d570: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d580: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d590: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d5a0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d5b0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d5c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d5d0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d5e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d5f0: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d600: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d610: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d620: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d630: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d640: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d650: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d660: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d670: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d680: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d690: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d6a0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d6b0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d6c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d6d0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
d6e0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d6f0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d700: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d710: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
d720: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
d730: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
d740: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
d750: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
d760: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
d770: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
d780: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
d790: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
d7a0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d7b0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d7c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d7d0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
d7e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d7f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d820: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
d830: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
d840: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d850: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d860: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
d870: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d880: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d890: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d8a0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d8b0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d8c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d8d0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d8e0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d8f0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d900: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
d910: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
d920: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
d930: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d940: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
d950: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
d960: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
d970: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
d980: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
d990: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
d9a0: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
d9b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
d9c0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
d9d0: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
d9e0: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
d9f0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
da00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
da10: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
da20: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
da30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
da40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
da50: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
da60: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
da70: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
da80: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
da90: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
daa0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
dab0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
dac0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
dad0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
dae0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
daf0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
db00: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
db10: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
db20: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
db30: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
db40: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
db50: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
db60: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
db70: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
db80: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
db90: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
dba0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
dbb0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
dbc0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
dbd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
dbe0: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
dbf0: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
dc00: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
dc10: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
dc20: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
dc30: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
dc40: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
dc50: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
dc60: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
dc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
dc80: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
dc90: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
dca0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
dcb0: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
dcc0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
dcd0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
dce0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
dcf0: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
dd00: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
dd10: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
dd20: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
dd30: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
dd40: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
dd50: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
dd60: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
dd70: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
dd80: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
dd90: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
dda0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
ddb0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ddc0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
ddd0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
dde0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
ddf0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
de00: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
de10: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
de20: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
de30: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
de40: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
de50: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
de60: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
de70: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64    }.  }.  ..#ifd
de80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
de90: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
dea0: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
deb0: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
dec0: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
ded0: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
dee0: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
def0: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
df00: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
df10: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
df20: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
df30: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
df40: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
df50: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
df60: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
df70: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
df80: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
df90: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
dfa0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
dfb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
dfc0: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
dfd0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
dfe0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
dff0: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
e000: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
e010: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
e020: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
e030: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
e040: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
e050: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
e060: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e070: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
e080: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e090: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e0a0: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
e0b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e0c0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
e0d0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
e0e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
e0f0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e100: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
e110: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
e120: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
e130: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
e140: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
e150: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
e160: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
e170: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
e180: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
e190: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
e1a0: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
e1b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
e1c0: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
e1d0: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
e1e0: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
e1f0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
e200: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
e210: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
e220: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
e230: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
e240: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
e250: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
e260: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
e270: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
e280: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
e290: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
e2a0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
e2b0: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
e2c0: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
e2d0: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
e2e0: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
e2f0: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
e300: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e310: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e320: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
e330: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
e340: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
e350: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e360: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
e370: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
e380: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
e390: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
e3a0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
e3b0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
e3c0: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e3d0: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e3e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
e3f0: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
e400: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
e410: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
e420: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
e430: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
e440: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
e450: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
e460: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
e470: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
e480: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
e490: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
e4a0: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
e4b0: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
e4c0: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
e4d0: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
e4e0: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
e4f0: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
e500: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
e510: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
e520: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
e530: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
e540: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
e550: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
e560: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
e570: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
e580: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e590: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
e5a0: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
e5b0: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
e5c0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e5d0: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
e5e0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
e5f0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
e600: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
e610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
e620: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
e630: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
e640: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
e650: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
e660: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e670: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
e680: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
e690: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
e6a0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
e6b0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
e6c0: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
e6d0: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
e6e0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
e6f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e700: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
e710: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
e720: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
e730: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e740: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
e750: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
e760: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
e770: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
e780: 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
e790: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
e7a0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
e7b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e7c0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e7d0: 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
e7e0: 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ck );..#ifdef SQ
e7f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
e800: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
e810: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
e820: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
e830: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
e840: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
e850: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
e860: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
e870: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
e880: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
e890: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
e8a0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
e8b0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
e8c0: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
e8d0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
e8e0: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
e8f0: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
e900: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
e910: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
e920: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
e930: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
e940: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
e950: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
e960: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
e970: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
e980: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
e990: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
e9a0: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
e9b0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
e9c0: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
e9d0: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
e9e0: 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
e9f0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
ea00: 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
ea10: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
ea20: 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
ea30: 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
ea40: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
ea50: 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
ea60: 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
ea70: 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
ea80: 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
ea90: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
eaa0: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
eab0: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
eac0: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
ead0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
eae0: 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
eaf0: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
eb00: 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
eb10: 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
eb20: 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
eb30: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
eb40: 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
eb50: 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
eb60: 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
eb70: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
eb80: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
eb90: 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65  LOCK ){..#if !de
eba0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
ebb0: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42   || !SQLITE_ENAB
ebc0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
ebd0: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e  .      (void)han
ebe0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20  dleNFSUnlock;.  
ebf0: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64      assert( hand
ec00: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29  leNFSUnlock==0 )
ec10: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
ec20: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
ec30: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
ec40: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
ec50: 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e       if( handleN
ec60: 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  FSUnlock ){.    
ec70: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20      int tErrno; 
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec90: 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
eca0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72   system call err
ecb0: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ors */.        o
ecc0: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
ecd0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
ece0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
ecf0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ed00: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
ed10: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ed20: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ed30: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ed40: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ed50: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
ed60: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
ed70: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
ed80: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
ed90: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
eda0: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
edb0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
edc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
edd0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
ede0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
edf0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ee00: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ee10: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ee20: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ee30: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ee40: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ee50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
ee60: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
ee70: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
ee80: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ee90: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
eea0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
eeb0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
eec0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
eed0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
eee0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
eef0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ef00: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
ef10: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
ef20: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
ef30: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
ef40: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
ef50: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
ef60: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
ef70: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ef80: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ef90: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
efa0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
efb0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
efc0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
efd0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
efe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
eff0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f000: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f010: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f020: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f030: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f040: 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69  ARED_FIRST+divSi
f050: 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ze;.        lock
f060: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
f070: 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20  SIZE-divSize;.  
f080: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
f090: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f0a0: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
f0b0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
f0c0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f0d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f0e0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
f0f0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f100: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
f110: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
f120: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
f130: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
f140: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
f150: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f170: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
f180: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f190: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f1a0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
f1b0: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
f1c0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f1d0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
f1e0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f1f0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f200: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f210: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
f220: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f230: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f240: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f250: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f260: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
f270: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
f280: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
f290: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
f2a0: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
f2b0: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
f2c0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
f2d0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
f2e0: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
f2f0: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
f300: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f310: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
f320: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
f330: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
f340: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
f350: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
f360: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
f370: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
f380: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
f390: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
f3a0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
f3b0: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
f3c0: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
f3d0: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
f3e0: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
f3f0: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
f400: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
f410: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f420: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
f430: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  CK;.          pF
f440: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f450: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f460: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
f470: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
f490: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f4a0: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
f4b0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f4c0: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
f4d0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
f4e0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
f4f0: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
f500: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
f510: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
f520: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
f530: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f540: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
f550: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
f560: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
f570: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
f580: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f590: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
f5a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f5b0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f5c0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f5d0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f5e0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f5f0: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f600: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f610: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f620: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f630: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f640: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
f650: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
f660: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
f670: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
f680: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
f690: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
f6a0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
f6b0: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
f6c0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f6d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
f6e0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f6f0: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
f700: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f710: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f720: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
f730: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
f740: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f750: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f760: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
f770: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f780: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
f7a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f7b0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f7c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f7d0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f7e0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f7f0: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f800: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
f810: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f820: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
f830: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
f840: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
f850: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
f860: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
f870: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
f880: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
f890: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
f8a0: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
f8b0: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
f8c0: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
f8d0: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
f8e0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
f8f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
f900: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
f910: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
f920: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
f930: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
f940: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
f950: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
f960: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
f970: 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
f980: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
f990: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f9a0: 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
f9b0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f9c0: 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
f9d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
f9e0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f9f0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
fa00: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
fa10: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
fa20: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
fa30: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
fa40: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
fa50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
fa60: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
fa70: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
fa80: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
fa90: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
faa0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
fab0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
fac0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
fad0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
fae0: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
faf0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fb00: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69  t eFileLock){.#i
fb10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
fb20: 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72  P_SIZE>0.  asser
fb30: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
fb40: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
fb50: 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
fb60: 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
fb70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
fb80: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
fb90: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
fba0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
fbb0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
fbc0: 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
fbd0: 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
fbe0: 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74  , i64 nByte);.st
fbf0: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
fc00: 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
fc10: 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a   *pFd);.#endif..
fc20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
fc30: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
fc40: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
fc50: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
fc60: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
fc70: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
fc80: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
fc90: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
fca0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
fcb0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
fcc0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
fcd0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
fce0: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
fcf0: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
fd00: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
fd10: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
fd20: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
fd30: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
fd40: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
fd50: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
fd60: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
fd70: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
fd80: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
fd90: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
fda0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
fdb0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
fdc0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
fdd0: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
fde0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
fdf0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23  (unixFile*)id;.#
fe00: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
fe10: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
fe20: 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
fe30: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
fe40: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
fe50: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
fe60: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
fe70: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
fe80: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
fe90: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
fea0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
feb0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
fec0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
fed0: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
fee0: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
fef0: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
ff00: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
ff10: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
ff20: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
ff30: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
ff40: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
ff50: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
ff60: 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41   SQLITE_UNLINK_A
ff70: 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28  FTER_CLOSE.  if(
ff80: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
ff90: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
ffa0: 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  ETE ){.    osUnl
ffb0: 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ink(pFile->zPath
ffc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ffd0: 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46  ree(*(char**)&pF
ffe0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
fff0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
10000 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
10010 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
10020 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
10030 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
10040 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
10050 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
10060 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
10070 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
10080 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
10090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
100a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
100b0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
100c0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
100d0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
100e0 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
100f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
10100 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10110 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
10120 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
10130 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c  File);.  unixUnl
10140 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
10150 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
10160 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78  ex();..  /* unix
10170 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61  File.pInode is a
10180 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65  lways valid here
10190 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64  . Otherwise, a d
101a0 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20  ifferent close. 
101b0 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67   ** routine (e.g
101c0 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29  . nolockClose())
101d0 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64   would be called
101e0 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
101f0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
10200 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20  pInode->nLock>0 
10210 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  || pFile->pInode
10220 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
10230 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  0 );.  if( ALWAY
10240 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29  S(pFile->pInode)
10250 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
10260 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
10270 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10280 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
10290 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
102a0 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
102b0 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65  e just.    ** ye
102c0 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
102d0 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
102e0 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
102f0 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
10300 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
10310 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75   to pInode->pUnu
10320 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69  sed list.  It wi
10330 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
10340 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20  lly closed .    
10350 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
10360 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
10370 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74  ..    */.    set
10380 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
10390 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49  ;.  }.  releaseI
103a0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
103b0 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
103c0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
103d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
103e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
10400 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
10410 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
10420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
10490 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
10500 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
10510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10530 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
10540 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
10550 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
10560 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
10570 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
10580 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
10590 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
105a0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
105b0 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
105c0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
105d0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
105e0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
105f0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
10600 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
10610 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
10620 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
10630 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
10640 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
10650 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
10660 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
10670 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
10680 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
10690 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
106a0 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
106b0 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
106c0 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
106d0 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
106e0 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
106f0 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
10700 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10710 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
10720 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
10730 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
10740 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
10750 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
10760 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
10770 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
10780 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
10790 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
107a0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
107b0 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
107c0 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
107d0 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
107e0 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
107f0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
10800 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
10810 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
10820 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
10830 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10840 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
10850 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
10860 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
10870 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
10880 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10890 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
108a0 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
108b0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
108c0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
108d0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
108e0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
108f0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10900 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10910 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10920 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
10930 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
10940 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
10950 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10960 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
10970 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
10980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10990 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
109a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
109b0 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
109c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
109d0 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
109e0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
109f0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10a00 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10a10 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
10a20 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
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 2a 2a 2a 2a  ****************
10a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
10a90 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ae0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
10b00 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
10b10 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b30 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
10b40 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
10b50 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
10b60 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
10b70 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
10b80 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
10b90 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
10ba0 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
10bb0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
10bc0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
10bd0 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
10be0 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
10bf0 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
10c00 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
10c10 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
10c20 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
10c30 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
10c40 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
10c50 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
10c60 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
10c70 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
10c80 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
10c90 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
10ca0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
10cb0 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
10cc0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
10cd0 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
10ce0 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
10cf0 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
10d00 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
10d10 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
10d20 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
10d30 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
10d40 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
10d50 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
10d60 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
10d70 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
10d80 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
10d90 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
10da0 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
10db0 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
10dc0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
10dd0 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
10de0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
10df0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
10e00 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
10e10 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
10e20 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
10e30 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
10e40 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
10e50 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
10e60 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
10e70 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
10e80 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
10e90 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
10ea0 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
10eb0 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
10ec0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
10ed0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
10ee0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
10ef0 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
10f00 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
10f10 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
10f20 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
10f30 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
10f40 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
10f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10f60 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10f70 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10f80 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10f90 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10fa0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10fb0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
10fc0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
10fd0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
10fe0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
10ff0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
11000 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
11010 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
11020 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
11030 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
11040 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
11050 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
11060 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
11070 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
11080 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
11090 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
110a0 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
110b0 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
110c0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
110d0 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
110e0 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
110f0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
11100 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
11110 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
11120 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
11130 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
11140 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
11150 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
11160 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
11170 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11180 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
11190 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
111a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
111b0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
111c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
111d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
111e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
111f0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11200 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11210 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
11220 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11230 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
11240 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
11250 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
11260 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
11270 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11280 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11290 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  OCK ){.    /* Ei
112a0 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63  ther this connec
112b0 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68  tion or some oth
112c0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  er connection in
112d0 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
112e0 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61  s.    ** holds a
112f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
11300 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e.  No need to c
11310 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f  heck further. */
11320 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
11330 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
11340 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68  /* The lock is h
11350 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  eld if and only 
11360 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20  if the lockfile 
11370 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f  exists */.    co
11380 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  nst char *zLockF
11390 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
113a0 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
113b0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65  gContext;.    re
113c0 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73  served = osAcces
113d0 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d  s(zLockFile, 0)=
113e0 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  =0;.  }.  OSTRAC
113f0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
11400 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f   %d %d %d (dotlo
11410 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11420 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
11430 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ;.  *pResOut = r
11440 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
11450 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
11460 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
11470 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
11480 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
11490 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
114a0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
114b0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
114c0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
114d0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
114e0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
114f0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
11500 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
11510 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
11520 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
11530 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
11540 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
11550 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
11560 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
11570 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
11580 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
11590 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
115a0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
115b0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
115c0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
115d0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
115e0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
115f0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
11600 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
11610 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
11620 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
11630 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
11640 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
11650 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
11660 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
11670 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
11680 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
11690 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
116a0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
116b0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
116c0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
116d0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
116e0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
116f0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
11700 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
11710 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
11720 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
11730 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
11740 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
11750 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
11760 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
11770 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ng level..**.** 
11780 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63  With dotfile loc
11790 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20  king, we really 
117a0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61  only support sta
117b0 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56  te (4): EXCLUSIV
117c0 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61  E..** But we tra
117d0 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63  ck the other loc
117e0 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65  king levels inte
117f0 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rnally..*/.stati
11800 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
11810 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11820 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
11830 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
11840 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11850 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
11860 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
11870 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
11880 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
11890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
118a0 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  ...  /* If we ha
118b0 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ve any lock, the
118c0 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  n the lock file 
118d0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
118e0 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   All we have.  *
118f0 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73  * to do is adjus
11900 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72  t our internal r
11910 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63  ecord of the loc
11920 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20  k level..  */.  
11930 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
11940 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29  Lock > NO_LOCK )
11950 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
11960 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
11970 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  ck;.    /* Alway
11980 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d  s update the tim
11990 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c  estamp on the ol
119a0 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66  d file */.#ifdef
119b0 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20   HAVE_UTIME.    
119c0 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c  utime(zLockFile,
119d0 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20   NULL);.#else.  
119e0 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69    utimes(zLockFi
119f0 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  le, NULL);.#endi
11a00 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
11a10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11a20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
11a30 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
11a40 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f  rc = osMkdir(zLo
11a50 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20  ckFile, 0777);. 
11a60 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
11a70 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
11a80 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f  en/create the lo
11a90 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  ck directory */.
11aa0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
11ab0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
11ac0 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f  EEXIST == tErrno
11ad0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
11ae0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
11af0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
11b00 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
11b10 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11b20 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11b30 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
11b40 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11b50 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
11b60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11b70 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
11b80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
11b90 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20  turn rc;.  } .  
11ba0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
11bb0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
11bc0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
11bd0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11be0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
11bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c00 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
11c10 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
11c20 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
11c30 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
11c40 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
11c50 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
11c60 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
11c70 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
11c80 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
11c90 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
11ca0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
11cb0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
11cc0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
11cd0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
11ce0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11cf0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
11d00 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
11d10 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
11d20 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
11d30 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
11d40 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
11d50 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
11d60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11d70 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11d80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11d90 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11da0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11db0 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
11dc0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11dd0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
11de0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11df0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
11e00 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
11e10 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
11e20 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
11e30 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
11e40 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
11e50 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
11e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
11e70 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
11e80 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
11e90 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
11ea0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11eb0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
11ec0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
11ed0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11ee0 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e   }..  /* To down
11ef0 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c  grade to shared,
11f00 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f   simply update o
11f10 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69  ur internal noti
11f20 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
11f30 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e  ock state.  No n
11f40 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68  eed to mess with
11f50 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
11f60 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
11f70 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
11f80 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11f90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
11fa0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
11fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11fc0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f  ;.  }.  .  /* To
11fd0 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68   fully unlock th
11fe0 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65  e database, dele
11ff0 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
12000 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46   */.  assert( eF
12010 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
12020 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64   );.  rc = osRmd
12030 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20  ir(zLockFile);. 
12040 20 69 66 28 20 72 63 3c 30 20 26 26 20 65 72 72   if( rc<0 && err
12050 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 20 72 63  no==ENOTDIR ) rc
12060 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63   = osUnlink(zLoc
12070 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  kFile);.  if( rc
12080 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45  <0 ){.    int tE
12090 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
120a0 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 66    rc = 0;.    if
120b0 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72  ( ENOENT != tErr
120c0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
120d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
120e0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
120f0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12100 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
12110 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12120 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
12130 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
12140 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
12150 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12160 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12170 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12180 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61  lose a file.  Ma
12190 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
121a0 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73   has been releas
121b0 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e  ed before closin
121c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
121d0 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71   dotlockClose(sq
121e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
121f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12200 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
12210 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
12220 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12230 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74  ile*)id;.    dot
12240 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
12250 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c  O_LOCK);.    sql
12260 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
12270 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
12280 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
12290 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
122a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
122b0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
122c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
122d0 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
122e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
122f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12300 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12350 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
123c0 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
123d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123f0 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
12400 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
12410 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
12420 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
12430 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
12440 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
12450 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
12460 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
12470 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
12480 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
12490 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
124a0 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
124b0 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
124c0 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
124d0 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
124e0 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
124f0 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
12500 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
12510 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
12520 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
12530 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
12540 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
12550 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
12560 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
12570 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
12580 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
12590 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
125a0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
125b0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
125c0 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
125d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
125e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
125f0 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69 66  turned off or if
12600 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  .** compiling fo
12610 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69  r VXWORKS..*/.#i
12620 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12630 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
12640 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a   !OS_VXWORKS../*
12650 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28  .** Retry flock(
12660 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
12670 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a  l with EINTR.*/.
12680 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61  #ifdef EINTR.sta
12690 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
126a0 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74  lock(int fd, int
126b0 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   op){.  int rc;.
126c0 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b    do{ rc = flock
126d0 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28  (fd,op); }while(
126e0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
126f0 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
12700 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
12710 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c  define robust_fl
12720 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61  ock(a,b) flock(a
12730 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ,b).#endif.     
12740 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12750 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
12760 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
12770 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
12780 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
12790 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
127a0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
127b0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
127c0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
127d0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
127e0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
127f0 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
12800 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
12810 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
12820 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
12830 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
12840 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
12850 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
12860 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
12870 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
12880 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12890 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
128a0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
128b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
128c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
128d0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
128e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
128f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12900 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
12910 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
12920 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
12930 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
12940 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
12950 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
12960 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
12970 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
12980 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
12990 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
129a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
129b0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
129c0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
129d0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
129e0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
129f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
12a00 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
12a10 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
12a20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
12a30 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
12a40 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62     int lrc = rob
12a50 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
12a60 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
12a70 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
12a80 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
12a90 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
12aa0 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
12ab0 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66    lrc = robust_f
12ac0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
12ad0 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
12ae0 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
12af0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
12b00 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
12b10 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
12b20 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
12b30 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  /.        lrc = 
12b40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
12b50 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 69 66  OCK; .        if
12b60 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12b70 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
12b80 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12b90 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
12ba0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
12bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12bc0 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
12bd0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12be0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12bf0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12c00 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
12c10 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
12c20 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
12c30 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
12c40 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12c50 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
12c60 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
12c70 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
12c80 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
12c90 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12ca0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
12cb0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
12cc0 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
12cd0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
12ce0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
12cf0 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
12d00 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12d10 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12d20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
12d30 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12d40 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
12d50 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
12d60 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
12d70 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
12d80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
12d90 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
12da0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
12db0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12dc0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
12dd0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12de0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12df0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12e00 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12e10 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12e20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12e30 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12e40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12e50 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12e60 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12e70 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12e80 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12e90 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12ea0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12eb0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12ec0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12ed0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12ee0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12ef0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12f00 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12f10 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12f20 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12f30 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12f40 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12f50 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
12f60 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
12f70 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
12f80 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
12f90 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
12fa0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
12fb0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12fc0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12fd0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12fe0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12ff0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13000 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13010 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13020 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13030 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
13040 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
13050 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13060 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
13070 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
13080 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
13090 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
130a0 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
130b0 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
130c0 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
130d0 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
130e0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
130f0 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
13100 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
13110 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
13120 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
13130 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
13140 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
13150 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
13160 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
13170 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
13180 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
13190 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
131a0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
131b0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
131c0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
131d0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
131e0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
131f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
13200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13210 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
13220 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13230 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
13240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13250 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13260 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13270 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
13280 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
13290 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
132a0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
132b0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
132c0 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
132d0 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
132e0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
132f0 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
13300 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
13310 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13320 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13330 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
13340 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13350 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
13360 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
13370 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
13380 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
13390 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
133a0 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
133b0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
133c0 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
133d0 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
133e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
133f0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13400 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13410 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
13420 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13430 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
13440 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13450 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
13460 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
13470 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13480 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13490 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
134a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
134b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
134c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
134d0 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66  K    %d %s %s (f
134e0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
134f0 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
13500 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
13510 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
13520 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
13530 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66  ailed"));.#ifdef
13540 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13550 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13560 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
13570 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
13580 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
13590 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
135a0 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
135b0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
135c0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
135d0 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
135e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
135f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13600 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13610 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13620 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
13630 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
13640 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
13650 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
13660 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
13670 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13680 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13690 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
136a0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
136b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
136c0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
136d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
136e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
136f0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
13700 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13710 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13720 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13730 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13740 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
13750 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
13760 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
13770 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
13780 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
13790 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
137a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
137b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
137c0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
137d0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
137e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
137f0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
13800 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
13810 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13820 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
13830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13840 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13850 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
13860 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
13870 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
13880 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
13890 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
138a0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
138b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
138c0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
138d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
138e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
138f0 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
13900 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28  unlock. */.  if(
13910 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
13920 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
13930 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
13940 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
13950 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
13960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13970 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13980 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
13990 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
139a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139b0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
139c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
139d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
139e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
139f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
13a10 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
13a20 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65  c int flockClose
13a30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13a40 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
13a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
13a60 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b   id ){.    flock
13a70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
13a80 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  CK);.    rc = cl
13a90 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
13aa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13ab0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
13ac0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
13ad0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
13ae0 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a  S_VXWORK */../**
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b00 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f  * End of the flo
13b10 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ck lock implemen
13b20 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d  ****** Begin Nam
13c00 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63  ed Semaphore Loc
13c10 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13c30 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
13c40 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
13c50 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
13c60 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20   VxWorks..**.** 
13c70 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  Semaphore lockin
13c80 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f  g is like dot-lo
13c90 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20  ck and flock in 
13ca0 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f  that it really o
13cb0 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  nly.** supports 
13cc0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e  EXCLUSIVE lockin
13cd0 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  g.  Only a singl
13ce0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65  e process can re
13cf0 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74  ad or write.** t
13d00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13d10 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
13d20 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74  s reduces potent
13d30 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c  ial concurrency,
13d40 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   but.** makes th
13d50 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
13d60 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65  ation much easie
13d70 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  r..*/.#if OS_VXW
13d80 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
13d90 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
13da0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
13db0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
13dc0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
13dd0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
13de0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
13df0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
13e00 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
13e10 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
13e20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
13e30 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
13e40 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
13e50 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
13e60 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
13e70 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
13e80 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
13e90 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
13ea0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
13eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13ec0 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
13ed0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13ee0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
13ef0 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
13f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
13f10 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
13f20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13f30 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13f40 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
13f50 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
13f60 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
13f70 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
13f80 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
13f90 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
13fa0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
13fb0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
13fc0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
13fd0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
13fe0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
13ff0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
14000 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
14010 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
14020 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
14030 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
14040 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
14050 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
14060 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
14070 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
14080 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  m;..    if( sem_
14090 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
140a0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
140b0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
140c0 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
140d0 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
140e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
140f0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
14100 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
14110 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
14120 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
14130 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
14140 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
14150 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
14160 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e         /* someon
14170 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c  e else has the l
14180 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20  ock when we are 
14190 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  in NO_LOCK */.  
141a0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
141b0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
141c0 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck < SHARED_LOCK
141d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
141e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77  else{.      /* w
141f0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
14200 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
14210 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28  .      sem_post(
14220 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSem);.    }.  }
14230 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
14240 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
14250 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
14260 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
14270 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
14280 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
14290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
142a0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
142b0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
142c0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
142d0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
142e0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
142f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14300 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14310 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14320 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14330 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14340 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14350 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14360 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14370 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14380 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14390 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
143a0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
143b0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
143c0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
143d0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
143e0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
143f0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14400 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14410 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14420 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14430 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14440 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14450 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14460 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14470 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14480 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14490 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
144a0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
144b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
144c0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
144d0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
144e0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
144f0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14500 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14510 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14520 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14530 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14540 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14550 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  E.**.** Semaphor
14560 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61  e locks only rea
14570 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
14580 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
14590 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
145a0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
145b0 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
145c0 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
145d0 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
145e0 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
145f0 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
14600 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
14610 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
14620 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
14630 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
14640 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
14650 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14660 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
14670 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
14680 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14690 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
146a0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
146b0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
146c0 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74  nt semLock(sqlit
146d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
146e0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
146f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14700 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14710 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
14720 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
14730 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
14740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
14750 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
14760 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
14770 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
14780 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
14790 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
147a0 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
147b0 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
147c0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
147d0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
147e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
147f0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
14800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14810 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
14820 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
14830 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
14840 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
14850 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
14860 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
14870 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
14880 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
14890 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
148a0 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
148b0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
148c0 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
148d0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
148e0 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
148f0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14900 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
14910 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
14920 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
14930 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
14940 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
14950 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
14960 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
14970 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
14980 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
14990 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
149a0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
149b0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
149c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
149d0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
149e0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
149f0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
14a00 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
14a10 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
14a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
14a30 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
14a40 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
14a50 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
14a60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14a70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
14a80 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
14a90 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14aa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14ab0 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
14ac0 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
14ad0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
14ae0 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
14af0 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14b00 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14b10 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14b20 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
14b30 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
14b40 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
14b50 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
14b60 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
14b70 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
14b80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
14b90 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
14ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14bb0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
14bc0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
14bd0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
14be0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
14bf0 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
14c00 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
14c10 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
14c20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14c30 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
14c40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14c50 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
14c60 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
14c70 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
14c80 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
14c90 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
14ca0 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
14cb0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14cc0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14cd0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
14ce0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
14cf0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
14d00 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
14d10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
14d20 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
14d30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14d40 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
14d50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14d60 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
14d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14d80 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
14d90 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
14da0 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c  int semClose(sql
14db0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
14dc0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
14dd0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14de0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14df0 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28  ;.    semUnlock(
14e00 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
14e10 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
14e20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
14e30 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
14e40 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
14e50 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
14e60 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
14e70 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
14e80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
14ea0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
14eb0 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
14ec0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
14ed0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
14ee0 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
14ef0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
14f00 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
14f10 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
14f20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
14f30 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
14f40 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
14f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f90 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
14fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fe0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15000 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
15010 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
15020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15030 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
15040 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
15050 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
15060 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
15070 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
15080 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
15090 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
150a0 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
150b0 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
150c0 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
150d0 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
150e0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
150f0 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
15100 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
15110 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
15120 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
15130 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
15140 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
15150 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
15160 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
15170 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
15180 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
15190 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
151a0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
151b0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
151c0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
151d0 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
151e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
151f0 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
15200 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
15210 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
15220 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15230 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
15240 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
15250 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
15260 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15270 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
15280 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
15290 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
152a0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
152b0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
152c0 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
152d0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
152e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
152f0 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
15300 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
15310 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
15320 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
15330 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15340 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
15350 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
15360 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
15370 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
15380 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
15390 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
153a0 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
153b0 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
153c0 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
153f0 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
15400 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
15410 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
15420 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
15430 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
15440 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
15450 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
15460 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
15470 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
15480 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
15490 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
154a0 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
154b0 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
154c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
154d0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
154e0 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
154f0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
15500 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
15510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
15520 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
15530 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
15540 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
15550 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
15560 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15570 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15580 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
15590 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
155a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
155b0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
155c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
155d0 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
155e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
155f0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
15600 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15610 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
15620 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
15630 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
15640 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
15650 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
15660 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
15670 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
15680 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
15690 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
156a0 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
156b0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
156c0 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
156d0 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
156e0 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
156f0 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
15700 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
15710 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
15720 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
15730 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
15740 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
15750 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
15760 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
15770 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
15780 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
15790 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
157a0 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
157b0 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
157c0 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
157d0 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
157e0 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
157f0 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
15800 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
15810 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
15820 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
15830 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15840 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
15850 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
15860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
15870 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
15880 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
15890 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
158a0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
158b0 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
158c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
158d0 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
158e0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
158f0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
15920 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
15930 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
15940 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
15950 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
15960 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
15970 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
15980 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
15990 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
159a0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
159b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
159c0 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
159d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
159e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
159f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15a00 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
15a10 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
15a20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
15a30 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
15a40 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
15a50 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
15a60 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
15a70 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
15a80 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
15a90 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
15aa0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
15ab0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
15ac0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15ad0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
15ae0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
15af0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
15b00 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
15b10 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
15b20 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
15b30 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
15b40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15b50 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
15b60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15b70 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
15b80 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
15b90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15ba0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
15bb0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
15bc0 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
15bd0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
15be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
15bf0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
15c00 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
15c10 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15c20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
15c30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
15c40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
15c50 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
15c60 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
15c70 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
15c80 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
15c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15ca0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15cb0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
15cc0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
15cd0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
15ce0 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
15cf0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
15d00 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
15d10 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
15d20 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
15d30 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
15d40 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
15d50 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
15d60 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
15d70 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
15d80 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
15d90 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
15da0 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
15db0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
15dc0 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
15dd0 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
15de0 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
15df0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15e00 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
15e10 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
15e20 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
15e30 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
15e40 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
15e50 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
15e60 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
15e70 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
15e80 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
15e90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
15ea0 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
15eb0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15ec0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15ed0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
15ee0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
15ef0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
15f00 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
15f10 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
15f20 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
15f30 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
15f40 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
15f50 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
15f60 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15f70 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
15f80 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
15f90 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
15fa0 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
15fb0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
15fc0 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
15fd0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
15fe0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
15ff0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
16000 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
16010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
16020 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
16030 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
16040 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
16050 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
16060 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
16070 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16080 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
16090 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
160a0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
160b0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
160c0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
160d0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
160e0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
160f0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
16100 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
16110 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
16120 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
16130 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
16140 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
16150 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
16160 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
16170 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
16180 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
16190 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
161a0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
161b0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
161c0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
161d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
161e0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
161f0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
16200 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
16210 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
16220 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
16230 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
16240 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
16250 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
16260 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
16270 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
16280 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
16290 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
162a0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
162b0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
162c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
162d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
162e0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
162f0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
16300 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
16310 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
16320 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
16330 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
16340 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
16350 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16360 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
16370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16380 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
16390 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
163a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
163b0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
163c0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
163d0 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
163e0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
163f0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16400 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16410 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16420 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16430 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
16440 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
16450 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
16460 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
16470 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
16480 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
16490 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
164a0 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
164b0 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
164c0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
164d0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
164e0 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
164f0 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
16500 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16510 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
16520 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
16530 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
16540 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
16550 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
16560 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
16570 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
16580 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
16590 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
165a0 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
165b0 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
165c0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
165d0 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
165e0 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
165f0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16600 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
16610 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
16620 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
16630 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
16640 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
16650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
16670 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
16680 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16690 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
166a0 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
166b0 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
166c0 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
166d0 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
166e0 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
166f0 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16700 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
16710 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
16720 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
16730 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
16740 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
16750 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
16760 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
16770 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
16780 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16790 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
167a0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
167b0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
167c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
167d0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
167e0 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
167f0 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16800 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16810 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
16820 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
16830 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
16840 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
16850 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
16860 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
16870 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
16880 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16890 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
168a0 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
168b0 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
168c0 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
168d0 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
168e0 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
168f0 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
16900 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
16910 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
16920 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
16930 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
16940 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
16950 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
16960 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
16970 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16980 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
16990 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
169a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
169b0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
169c0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
169d0 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
169e0 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
169f0 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
16a00 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
16a10 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
16a20 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
16a30 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
16a40 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
16a50 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
16a60 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
16a70 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
16a80 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16a90 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
16aa0 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16ab0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16ac0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
16ad0 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
16ae0 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
16af0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
16b00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16b10 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16b20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16b30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16b40 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
16b50 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
16b60 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
16b70 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
16b80 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
16b90 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16ba0 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
16bb0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16bc0 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
16bd0 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
16be0 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
16bf0 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
16c00 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
16c10 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
16c20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
16c30 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
16c40 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
16c50 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
16c60 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
16c70 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16c80 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
16c90 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
16ca0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
16cb0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16cc0 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
16cd0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
16ce0 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
16cf0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16d00 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16d10 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16d20 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
16d30 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
16d40 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
16d50 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16d60 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
16d70 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
16d80 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16d90 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16da0 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16db0 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16dc0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16dd0 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16de0 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16df0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
16e00 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16e10 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
16e20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
16e30 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
16e40 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
16e50 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16e60 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16e70 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16e80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16e90 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
16ea0 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
16eb0 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
16ec0 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
16ed0 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
16ee0 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
16ef0 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
16f00 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
16f10 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
16f20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
16f30 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
16f40 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
16f50 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
16f60 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
16f70 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
16f80 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
16f90 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
16fa0 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
16fb0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16fc0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16fd0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16fe0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16ff0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
17000 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17010 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
17020 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
17030 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
17040 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
17050 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
17060 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
17070 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
17080 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17090 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
170a0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
170b0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
170c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
170d0 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
170e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
170f0 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rc1Errno;.      
17100 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
17110 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17120 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
17130 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17140 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
17150 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
17160 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17170 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
17180 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
17190 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
171a0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
171b0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
171c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
171d0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
171e0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
171f0 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
17200 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
17210 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
17220 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
17230 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
17240 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
17250 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
17260 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
17270 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
17280 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
17290 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
172a0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
172b0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
172c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
172d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
172e0 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
172f0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
17300 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
17310 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
17320 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
17330 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
17340 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
17350 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
17360 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
17370 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
17380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
17390 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
173a0 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
173b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
173c0 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
173d0 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
173e0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
173f0 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
17400 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
17410 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
17420 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
17430 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17440 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17450 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17460 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
17470 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
17480 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
17490 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
174a0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
174b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
174c0 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
174d0 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
174e0 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
174f0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
17500 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
17510 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
17520 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17530 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
17540 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
17550 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
17560 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
17570 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
17580 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
17590 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
175a0 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
175b0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
175c0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
175d0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
175e0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
175f0 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17610 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
17620 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
17630 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
17640 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
17650 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
17660 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
17670 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
17680 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
17690 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
176a0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
176b0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
176c0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
176f0 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
17700 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
17710 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
17720 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17730 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17740 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
17750 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17760 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
17770 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17780 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
17790 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
177a0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
177b0 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
177c0 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
177d0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
177e0 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
177f0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
17800 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
17810 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
17820 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
17830 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
17840 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
17850 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
17860 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
17870 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17880 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
17890 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
178a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
178b0 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
178c0 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
178d0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
178e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
178f0 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
17900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17910 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17920 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
17930 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
17940 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
17950 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
17960 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17970 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
17980 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17990 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
179a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
179b0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
179c0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
179d0 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
179e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
179f0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
17a00 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
17a10 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17a20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
17a30 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
17a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
17a50 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
17a60 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
17a80 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17a90 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
17aa0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
17ab0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
17ac0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
17ad0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
17ae0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
17af0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
17b00 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
17b10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17b20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
17b30 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
17b40 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
17b50 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
17b60 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17b70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17b80 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
17b90 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17ba0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
17bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17bc0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17bd0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17be0 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
17bf0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
17c00 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
17c10 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
17c20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17c30 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
17c40 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
17c50 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
17c60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17c70 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
17c80 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
17c90 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
17ca0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
17cb0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
17cc0 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
17cd0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17ce0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
17cf0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17d00 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
17d10 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
17d20 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
17d30 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
17d40 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
17d50 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
17d60 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
17d70 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
17d80 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17d90 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
17da0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17db0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
17dc0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
17dd0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
17de0 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
17df0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17e00 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
17e10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
17e20 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
17e30 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
17e40 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
17e50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
17e60 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17e70 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
17e80 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17e90 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
17ea0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17eb0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
17ec0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
17ed0 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
17ee0 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
17ef0 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
17f00 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
17f10 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
17f20 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
17f30 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
17f40 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
17f50 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
17f60 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
17f70 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
17f80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17f90 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
17fa0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
17fb0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
17fc0 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
17fd0 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
17fe0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
17ff0 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
18000 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
18010 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
18020 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
18030 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
18040 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
18050 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
18060 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
18070 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
18080 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
18090 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
180a0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
180b0 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
180c0 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
180d0 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
180e0 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
180f0 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
18100 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
18110 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
18120 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
18130 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
18140 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
18150 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
18160 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
18170 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18180 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18190 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
181a0 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
181b0 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
181c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
181d0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
181e0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
181f0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
18200 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
18210 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
18220 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18230 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
18240 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
18250 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
18260 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
18270 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
18280 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
18290 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
182a0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
182b0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
182c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
182d0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
182e0 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
182f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18310 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
18320 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
18330 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
18340 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18350 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18360 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
18370 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
18380 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18390 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
183a0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
183b0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
183c0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
183d0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
183e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
183f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
18400 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
18410 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
18420 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
18430 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
18440 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
18450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
18470 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
18480 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
18490 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
184a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
184b0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
184c0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
184d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
184e0 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
184f0 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
18500 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
18510 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
18520 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
18530 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
18540 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
18550 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
18560 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
18570 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
18580 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
18590 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
185a0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
185b0 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
185c0 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
185d0 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
185e0 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
185f0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
18600 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
18610 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
18620 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18630 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
18640 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18650 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
18660 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18670 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
18680 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
18690 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
186a0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
186b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
186c0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
186d0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
186e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
186f0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
18700 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
18710 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
18720 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
18730 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
18740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18750 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18760 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18770 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
18780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18790 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
187a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
187b0 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
187c0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
187d0 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
187e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
187f0 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
18800 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
18810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
18820 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18830 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
18840 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18850 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
18860 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
18870 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
18880 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
18890 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
188a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
188b0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
188c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
188d0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
188e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
188f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
18900 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
18910 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
18920 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
18930 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
18940 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
18950 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
18960 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
18970 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
18980 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
18990 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
189a0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
189b0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
189c0 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
189d0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
189e0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
189f0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
18a00 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
18a10 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
18a20 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
18a30 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
18a40 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
18a50 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
18a60 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
18a70 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
18a80 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
18a90 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
18aa0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
18ab0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
18ac0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
18ad0 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
18ae0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
18af0 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
18b00 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
18b10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
18b20 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
18b30 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
18b40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18b50 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
18b60 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
18b70 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
18b80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
18b90 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
18ba0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
18bb0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
18bc0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
18bd0 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
18be0 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
18bf0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
18c00 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
18c10 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
18c20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
18c30 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
18c40 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
18c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c60 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
18c70 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
18c80 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
18c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
18cf0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
18d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
18d60 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
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 2f  ***************/
18d90 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
18da0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
18db0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18dc0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
18dd0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
18de0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
18df0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
18e00 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
18e10 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
18e20 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
18e30 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
18e40 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
18e50 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
18e60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
18e70 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
18e80 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
18e90 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
18ea0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
18eb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18ec0 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
18ed0 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
18ee0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
18ef0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
18f00 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
18f10 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
18f20 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
18f30 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
18f40 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
18f50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
18f60 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
18f70 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
18f80 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
18f90 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
18fa0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
18fb0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
18fc0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
18fd0 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
18fe0 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
18ff0 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
19000 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
19010 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
19020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
19030 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
19040 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
19050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19060 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190b0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
190c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19100 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
19110 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
19120 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
19130 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
19140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19150 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
19160 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
19170 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
19180 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
19190 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
191a0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
191b0 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
191c0 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
191d0 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
191e0 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
191f0 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
19200 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
19210 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
19220 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
19230 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
19240 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
19250 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
19260 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
19270 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
19280 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
19290 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
192a0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
192b0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
192c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
192d0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
192e0 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
192f0 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
19300 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
19310 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
19320 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
19330 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
19340 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
19350 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
19360 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
19370 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
19380 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
19390 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
193a0 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
193b0 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
193c0 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
193d0 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
193e0 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
193f0 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
19400 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
19410 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
19420 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
19430 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
19440 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
19450 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
19460 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
19470 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
19480 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
19490 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
194a0 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
194b0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
194c0 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
194d0 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
194e0 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
194f0 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
19500 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
19510 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e  .  int got;.  in
19520 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66  t prior = 0;.#if
19530 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
19540 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
19550 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
19560 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
19570 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
19580 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28  START;.  assert(
19590 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66   cnt==(cnt&0x1ff
195a0 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
195b0 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 63 6e   id->h>2 );.  cn
195c0 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  t &= 0x1ffff;.  
195d0 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
195e0 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
195f0 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
19600 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
19610 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
19620 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
19630 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
19640 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19650 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
19660 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
19670 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
19680 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19690 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
196a0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
196b0 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
196c0 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
196d0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
196e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
196f0 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
19700 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
19710 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  =offset ){.     
19720 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
19730 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
19740 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
19750 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
19760 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  no;.      }else{
19770 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
19780 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
19790 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rno = 0;.      }
197a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
197b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
197c0 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20  = osRead(id->h, 
197d0 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
197e0 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d  if.    if( got==
197f0 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cnt ) break;.   
19800 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
19810 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
19820 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b  INTR ){ got = 1;
19830 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
19840 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20     prior = 0;.  
19850 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19860 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19870 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62 72   errno;.      br
19880 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
19890 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
198a0 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
198b0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
198c0 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
198d0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
198e0 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
198f0 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19900 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19910 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19920 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19930 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19940 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
19950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
19960 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
19970 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
19980 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
19990 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
199a0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
199b0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
199c0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
199d0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
199e0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
199f0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
19a00 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
19a10 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
19a20 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
19a30 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
19a40 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
19a50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19a60 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
19a70 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
19a80 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
19a90 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
19aa0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19ab0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
19ac0 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
19ad0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
19ae0 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
19af0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
19b00 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
19b10 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19b20 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
19b30 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19b40 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
19b50 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
19b60 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
19b70 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
19b80 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
19b90 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
19ba0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
19bb0 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
19bc0 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
19bd0 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
19be0 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
19bf0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
19c00 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
19c10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
19c20 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
19c30 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
19c40 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
19c50 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
19c60 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
19c70 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
19c80 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
19c90 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
19ca0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
19cb0 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
19cc0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
19cd0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
19ce0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
19cf0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
19d00 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
19d10 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
19d20 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
19d30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19d40 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
19d50 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
19d60 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
19d70 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
19d80 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
19d90 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
19da0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
19db0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
19dc0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
19dd0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
19de0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
19df0 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
19e00 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
19e10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
19e20 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
19e30 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
19e40 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
19e50 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
19e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e70 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
19e80 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
19e90 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
19ea0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
19eb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19ec0 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
19ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
19ee0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
19ef0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
19f00 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
19f10 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
19f20 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
19f30 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
19f40 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
19f50 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
19f60 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
19f70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19f80 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
19f90 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
19fa0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b   Attempt to seek
19fb0 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69   the file-descri
19fc0 70 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ptor passed as t
19fd0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
19fe0 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65  t to.** absolute
19ff0 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68   offset iOff, th
1a000 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  en attempt to wr
1a010 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
1a020 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70  f data from.** p
1a030 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e  Buf to it. If an
1a040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
1a050 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74  eturn -1 and set
1a060 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72   *piErrno. Other
1a070 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  wise, .** return
1a080 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62   the actual numb
1a090 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
1a0a0 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62  ten (which may b
1a0b0 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e  e less than.** n
1a0c0 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Buf)..*/.static 
1a0d0 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1a0e0 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20  Fd(.  int fd,   
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
1a110 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74  scriptor to writ
1a120 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f  e to */.  i64 iO
1a130 66 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ff,             
1a140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a150 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69  e offset to begi
1a160 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
1a170 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1a180 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1a190 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1a1a0 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20  rom this buffer 
1a1b0 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
1a1c0 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20   int nBuf,      
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
1a1f0 65 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73  er pBuf in bytes
1a200 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72   */.  int *piErr
1a210 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
1a220 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
1a230 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72  ror number if er
1a240 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b  ror occurs */.){
1a250 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1a280 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63  rned by system c
1a290 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  all */..  assert
1a2a0 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78  ( nBuf==(nBuf&0x
1a2b0 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65  1ffff) );.  asse
1a2c0 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 6e 42  rt( fd>2 );.  nB
1a2d0 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20  uf &= 0x1ffff;. 
1a2e0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23   TIMER_START;..#
1a2f0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1a300 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d  READ).  do{ rc =
1a310 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42   osPwrite(fd, pB
1a320 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1a330 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a340 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a350 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1a360 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
1a370 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74 65 36  { rc = osPwrite6
1a380 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  4(fd, pBuf, nBuf
1a390 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20  , iOff);}while( 
1a3a0 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1a3b0 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64  INTR);.#else.  d
1a3c0 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b  o{.    i64 iSeek
1a3d0 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66   = lseek(fd, iOf
1a3e0 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  f, SEEK_SET);.  
1a3f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a400 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b 0a 0a 20  r( iSeek-- );.. 
1a410 20 20 20 69 66 28 20 69 53 65 65 6b 21 3d 69 4f     if( iSeek!=iO
1a420 66 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ff ){.      if( 
1a430 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1a440 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d 2d 31 20  no = (iSeek==-1 
1a450 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b 0a 20 20  ? errno : 0);.  
1a460 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a470 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
1a480 57 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  Write(fd, pBuf, 
1a490 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28  nBuf);.  }while(
1a4a0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a4b0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
1a4c0 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1a4d0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
1a4e0 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1a4f0 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63   %llu\n", fd, rc
1a500 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c  , iOff, TIMER_EL
1a510 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20  APSED));..  if( 
1a520 72 63 3c 30 20 26 26 20 70 69 45 72 72 6e 6f 20  rc<0 && piErrno 
1a530 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72  ) *piErrno = err
1a540 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  no;.  return rc;
1a550 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .}.../*.** Seek 
1a560 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1a570 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1a580 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1a590 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1a5a0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1a5b0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1a5c0 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1a5d0 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1a5e0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1a5f0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1a600 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1a610 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1a620 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1a630 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1a640 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1a650 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1a660 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1a670 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1a680 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1a690 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   cnt){.  return 
1a6a0 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69  seekAndWriteFd(i
1a6b0 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42  d->h, offset, pB
1a6c0 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61  uf, cnt, &id->la
1a6d0 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  stErrno);.}.../*
1a6e0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
1a6f0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
1a700 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
1a710 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1a720 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
1a730 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1a740 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
1a750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1a760 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
1a770 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
1a780 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1a790 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1a7a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1a7b0 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
1a7c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1a7d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1a7e0 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
1a7f0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1a800 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1a810 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a820 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a830 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1a840 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1a850 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1a860 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1a870 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1a880 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1a890 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1a8a0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1a8b0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1a8c0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1a8d0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1a8e0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1a8f0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1a900 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1a910 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   );.#endif..#ifd
1a920 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a930 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1a940 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1a950 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1a960 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1a970 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
1a980 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1a990 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1a9a0 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1a9b0 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
1a9c0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1a9d0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
1a9e0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1a9f0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
1aa00 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
1aa10 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1aa20 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1aa30 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
1aa40 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
1aa50 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
1aa60 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1aa70 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
1aa80 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
1aa90 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1aaa0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1aab0 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
1aac0 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
1aad0 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
1aae0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1aaf0 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
1ab00 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
1ab10 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1ab20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
1ab30 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1ab40 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
1ab50 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1ab60 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1ab70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ab80 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
1ab90 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
1aba0 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
1abb0 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
1abc0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1abd0 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
1abe0 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1abf0 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
1ac00 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
1ac10 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1ac20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1ac30 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1ac40 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1ac50 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1ac60 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1ac70 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1ac80 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1ac90 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1aca0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1acb0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1acc0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1acd0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1ace0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1acf0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1ad00 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1ad10 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1ad20 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1ad30 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1ad40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ad50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1ad60 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1ad70 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1ad80 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1ad90 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1ada0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1adb0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1adc0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1add0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1ade0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1adf0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1ae00 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1ae10 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1ae20 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1ae30 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ..  while( amt>0
1ae40 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
1ae50 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1ae60 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1ae70 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
1ae80 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1ae90 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1aea0 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1aeb0 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1aec0 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1aed0 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1aee0 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1aef0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1af00 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1af10 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1af20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
1af30 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
1af40 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1af50 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
1af60 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1af70 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1af80 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1af90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1afa0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1afb0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1afc0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
1afd0 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
1afe0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
1aff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1b000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1b010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b020 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1b030 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
1b040 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1b050 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
1b060 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
1b070 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1b080 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
1b090 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
1b0a0 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
1b0b0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
1b0c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b0d0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1b0e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
1b0f0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1b100 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1b110 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
1b120 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
1b130 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
1b140 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
1b150 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
1b160 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
1b170 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
1b180 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79  th the (slightly
1b190 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e   slower).** fsyn
1b1a0 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77  c(). If you know
1b1b0 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
1b1c0 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
1b1d0 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
1b1e0 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
1b1f0 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
1b200 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
1b210 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21  atasync.*/.#if !
1b220 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1b230 63 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  c).# define fdat
1b240 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
1b250 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
1b260 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1b270 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
1b280 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1b290 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
1b2a0 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
1b2b0 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
1b2c0 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
1b2d0 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
1b2e0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
1b2f0 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
1b300 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
1b310 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
1b320 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
1b330 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
1b340 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
1b350 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
1b360 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
1b370 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
1b380 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
1b390 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
1b3a0 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
1b3b0 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
1b3c0 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
1b3d0 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
1b3e0 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
1b3f0 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
1b400 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
1b410 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
1b420 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
1b430 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
1b440 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
1b450 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
1b460 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
1b470 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
1b480 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
1b490 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
1b4a0 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
1b4b0 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1b4c0 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
1b4d0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
1b4e0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1b4f0 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
1b500 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
1b510 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
1b520 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
1b530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b540 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ..**.** SQLite s
1b550 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79  ets the dataOnly
1b560 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a   flag if the siz
1b570 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
1b580 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54   unchanged..** T
1b590 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64  he idea behind d
1b5a0 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20  ataOnly is that 
1b5b0 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77  it should only w
1b5c0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f  rite the file co
1b5d0 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b  ntent.** to disk
1b5e0 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e  , not the inode.
1b5f0 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61    We only set da
1b600 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69  taOnly if the fi
1b610 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75  le size is .** u
1b620 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74  nchanged since t
1b630 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
1b640 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64  part of the inod
1b650 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a  e.  However, .**
1b660 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20   Ted Ts'o tells 
1b670 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  us that fdatasyn
1b680 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72  c() will also wr
1b690 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66  ite the inode if
1b6a0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a   the.** file siz
1b6b0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  e has changed.  
1b6c0 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69  The only real di
1b6d0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1b6e0 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20   fdatasync().** 
1b6f0 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64  and fsync(), Ted
1b700 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68   tells us, is th
1b710 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1b720 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68  ill not flush th
1b730 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68  e.** inode if th
1b740 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72  e mtime or owner
1b750 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20   or other inode 
1b760 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20  attributes have 
1b770 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f  changed..** We o
1b780 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74  nly care about t
1b790 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f  he file size, no
1b7a0 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65  t the other file
1b7b0 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a   attributes, so.
1b7c0 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c  ** as far as SQL
1b7d0 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64  ite is concerned
1b7e0 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29  , an fdatasync()
1b7f0 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75   is always adequ
1b800 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61  ate..** So, we a
1b810 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73  lways use fdatas
1b820 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61  ync() if it is a
1b830 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64  vailable, regard
1b840 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76  less of.** the v
1b850 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
1b860 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74  Only flag..*/.st
1b870 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
1b880 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
1b890 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
1b8a0 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
1b8b0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  c;..  /* The fol
1b8c0 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c  lowing "ifdef/el
1b8d0 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20  if/else/" block 
1b8e0 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  has the same str
1b8f0 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74  ucture as.  ** t
1b900 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74  he one below. It
1b910 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68   is replicated h
1b920 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76  ere solely to av
1b930 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a  oid cluttering .
1b940 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c    ** up the real
1b950 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55   code with the U
1b960 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b970 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23  ) macros..  */.#
1b980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1b990 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1b9a0 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
1b9b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b9c0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1b9d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1b9e0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48  taOnly);.#elif H
1b9f0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1ba00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ba10 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73  (dataOnly);.#els
1ba20 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
1ba30 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
1ba40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ba50 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1ba60 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  ndif..  /* Recor
1ba70 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
1ba80 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
1ba90 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
1baa0 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
1bab0 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
1bac0 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
1bad0 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
1bae0 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
1baf0 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
1bb00 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
1bb10 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
1bb20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1bb30 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
1bb40 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
1bb50 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
1bb60 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
1bb70 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
1bb80 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
1bb90 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
1bba0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
1bbb0 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
1bbc0 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
1bbd0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1bbe0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
1bbf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
1bc00 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1bc10 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
1bc20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   ){.    rc = osF
1bc30 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
1bc40 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  SYNC, 0);.  }els
1bc50 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1bc60 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
1bc70 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
1bc80 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
1bc90 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
1bca0 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f  c()..  ** It sho
1bcb0 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
1bcc0 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
1bcd0 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
1bce0 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  local .  ** file
1bcf0 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
1bd00 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
1bd10 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
1bd20 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74  FSYNC.  ** isn't
1bd30 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
1bd40 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
1bd50 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
1bd60 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20  fsync .  ** and 
1bd70 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
1bd80 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
1bd90 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
1bda0 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a  cntl call.  .  *
1bdb0 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
1bdc0 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
1bdd0 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
1bde0 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a  e and avoid .  *
1bdf0 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
1be00 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
1be10 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f   is called..  */
1be20 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
1be30 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c   fsync(fd);..#el
1be40 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1be50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61  LE__).  /* fdata
1be60 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64  sync() on HFS+ d
1be70 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68  oesn't yet flush
1be80 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1be90 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72  f it changed cor
1bea0 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63  rectly.  ** so c
1beb0 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61  urrently we defa
1bec0 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  ult to the macro
1bed0 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20   that redefines 
1bee0 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79  fdatasync to fsy
1bef0 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  nc.  */.  rc = f
1bf00 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20  sync(fd);.#else 
1bf10 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e  .  rc = fdatasyn
1bf20 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58  c(fd);.#if OS_VX
1bf30 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d  WORKS.  if( rc==
1bf40 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  -1 && errno==ENO
1bf50 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d  TSUP ){.    rc =
1bf60 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a   fsync(fd);.  }.
1bf70 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1bf80 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ORKS */.#endif /
1bf90 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  * ifdef SQLITE_N
1bfa0 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45  O_SYNC elif HAVE
1bfb0 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20  _FULLFSYNC */.. 
1bfc0 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20   if( OS_VXWORKS 
1bfd0 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20  && rc!= -1 ){.  
1bfe0 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    rc = 0;.  }.  
1bff0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c000 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1c010 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1c020 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1c030 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1c040 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1c050 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1c060 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1c070 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1c080 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1c090 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1c0a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c0b0 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1c0c0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1c0d0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1c0e0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1c0f0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1c100 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1c110 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  lue..**.** The d
1c120 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1c130 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64  scriptor is used
1c140 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68   for only one th
1c150 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e  ing - to.** fsyn
1c160 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20  c() a directory 
1c170 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c  to make sure fil
1c180 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64  e creation and d
1c190 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a  eletion events.*
1c1a0 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  * are flushed to
1c1b0 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79   disk.  Such fsy
1c1c0 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ncs are not need
1c1d0 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a  ed on newer.** j
1c1e0 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79  ournaling filesy
1c1f0 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72  stems, but are r
1c200 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72  equired on older
1c210 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
1c220 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c230 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
1c240 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65  en using the xSe
1c250 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61  tSysCall interfa
1c260 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69  ce..** The abili
1c270 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74  ty to override t
1c280 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1c290 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74  added in support
1c2a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d   of the.** chrom
1c2b0 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70  ium sandbox.  Op
1c2c0 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ening a director
1c2d0 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20  y is a security 
1c2e0 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20  risk (we are.** 
1c2f0 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20  told) so making 
1c300 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  it overrideable 
1c310 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d  allows the chrom
1c320 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a  ium sandbox to.*
1c330 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72  * replace this r
1c340 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61  outine with a ha
1c350 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54  rmless no-op.  T
1c360 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74  o make this rout
1c370 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20  ine.** a no-op, 
1c380 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
1c390 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75  a stub that retu
1c3a0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  rns SQLITE_OK bu
1c3b0 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64  t leaves.** *pFd
1c3c0 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69   set to a negati
1c3d0 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ve number..**.**
1c3e0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1c3f0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
1c400 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1c410 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
1c420 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
1c430 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
1c440 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
1c450 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
1c460 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
1c470 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
1c480 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
1c490 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
1c4a0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
1c4b0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
1c4c0 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
1c4d0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1c4e0 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
1c4f0 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
1c500 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
1c510 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
1c520 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
1c530 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1c540 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1c550 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1c560 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
1c570 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
1c580 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
1c590 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
1c5a0 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
1c5b0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1c5c0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1c5d0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1c5e0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
1c5f0 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
1c600 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
1c610 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72  ITE_OK:unixLogEr
1c620 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1c630 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
1c640 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a  , zDirname));.}.
1c650 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1c660 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1c670 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1c680 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1c690 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
1c6a0 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
1c6b0 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
1c6c0 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
1c6d0 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
1c6e0 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
1c6f0 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
1c700 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
1c710 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
1c720 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
1c730 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1c740 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
1c750 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1c760 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1c770 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
1c780 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
1c790 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
1c7a0 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
1c7b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1c7c0 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
1c7d0 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
1c7e0 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
1c7f0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
1c800 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
1c810 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
1c820 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1c830 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
1c840 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
1c850 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
1c860 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
1c870 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
1c880 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1c890 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
1c8a0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
1c8b0 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1c8c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
1c8d0 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
1c8e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
1c8f0 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
1c900 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
1c910 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
1c920 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1c930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1c940 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
1c950 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
1c960 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
1c970 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1c980 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1c990 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
1c9a0 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
1c9b0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
1c9c0 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
1c9d0 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
1c9e0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1c9f0 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
1ca00 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
1ca10 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1ca20 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
1ca30 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
1ca40 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
1ca50 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1ca60 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
1ca70 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1ca80 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
1ca90 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
1caa0 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
1cab0 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
1cac0 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
1cad0 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
1cae0 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
1caf0 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
1cb00 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1cb10 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
1cb20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1cb30 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
1cb40 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
1cb50 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1cb60 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
1cb70 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
1cb80 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
1cb90 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
1cba0 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
1cbb0 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
1cbc0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1cbd0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1cbe0 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
1cbf0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1cc00 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1cc10 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1cc20 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
1cc30 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
1cc40 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1cc50 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79  }..  /* Also fsy
1cc60 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
1cc70 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1cc80 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53  file if the DIRS
1cc90 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  YNC flag.  ** is
1cca0 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61   set.  This is a
1ccb0 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72   one-time occurr
1ccc0 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74  ence.  Many syst
1ccd0 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41  ems (examples: A
1cce0 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61  IX).  ** are una
1ccf0 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64  ble to fsync a d
1cd00 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e  irectory, so ign
1cd10 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68  ore errors on th
1cd20 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  e fsync..  */.  
1cd30 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
1cd40 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1cd50 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69  DIRSYNC ){.    i
1cd60 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53  nt dirfd;.    OS
1cd70 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
1cd80 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  %s (have_fullfsy
1cd90 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
1cda0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  d)\n", pFile->zP
1cdb0 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
1cdc0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
1cdd0 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20   isFullsync));. 
1cde0 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
1cdf0 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a  rectory(pFile->z
1ce00 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
1ce10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ce20 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30  E_OK && dirfd>=0
1ce30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66   ){.      full_f
1ce40 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30  sync(dirfd, 0, 0
1ce50 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
1ce60 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72  close(pFile, dir
1ce70 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
1ce80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1ce90 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
1cea0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1ceb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1cec0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1ced0 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c  lags &= ~UNIXFIL
1cee0 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20  E_DIRSYNC;.  }. 
1cef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cf00 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1cf10 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1cf20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1cf30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1cf40 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
1cf50 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1cf60 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
1cf70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1cf80 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1cf90 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1cfa0 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
1cfb0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1cfc0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1cfd0 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
1cfe0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1cff0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1d000 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1d010 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
1d020 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
1d030 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
1d040 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
1d050 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
1d060 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
1d070 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
1d080 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
1d090 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
1d0a0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
1d0b0 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
1d0c0 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
1d0d0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1d0e0 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
1d0f0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
1d100 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
1d110 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1d120 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1d130 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
1d140 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1d150 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79  e->h, (off_t)nBy
1d160 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
1d170 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1d180 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1d190 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1d1a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1d1b0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1d1c0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1d1d0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1d1e0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
1d1f0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  _DEBUG.    /* If
1d200 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1d210 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1d220 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1d230 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1d240 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1d250 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1d260 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1d270 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1d280 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1d290 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1d2a0 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1d2b0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1d2c0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1d2d0 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1d2e0 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1d2f0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1d300 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1d310 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1d320 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1d330 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1d340 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1d350 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1d360 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1d370 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1d380 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1d390 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1d3a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1d3b0 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1d3c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69      }.#endif..#i
1d3d0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1d3e0 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20  P_SIZE>0.    /* 
1d3f0 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
1d400 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20 74  just truncated t
1d410 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
1d420 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
1d430 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65  tly.    ** mappe
1d440 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65  d region, reduce
1d450 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d   the effective m
1d460 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77  apping size as w
1d470 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c  ell. SQLite will
1d480 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61 64  .    ** use read
1d490 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
1d4a0 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
1d4b0 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
1d4c0 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20  from now on.  . 
1d4d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42     */.    if( nB
1d4e0 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
1d4f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ize ){.      pFi
1d500 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
1d510 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Byte;.    }.#end
1d520 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
1d530 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1d540 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1d550 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1d560 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1d570 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1d580 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1d590 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1d5a0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1d5b0 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1d5c0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1d5d0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1d5e0 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1d5f0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1d600 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1d610 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1d620 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1d630 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1d640 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1d650 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1d660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d670 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
1d680 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
1d690 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70  e;..  /* When op
1d6a0 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a  ening a zero-siz
1d6b0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1d6c0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
1d6d0 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
1d6e0 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
1d6f0 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
1d700 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
1d710 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
1d720 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
1d730 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
1d740 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
1d750 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
1d760 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
1d770 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
1d780 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
1d790 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
1d7a0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
1d7b0 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
1d7c0 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
1d7d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
1d7e0 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
1d7f0 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
1d800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1d810 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d820 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1d830 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1d840 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
1d850 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
1d860 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
1d870 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
1d880 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
1d890 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
1d8a0 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
1d8b0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
1d8c0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1d8d0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
1d8e0 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  d*);.#endif../* 
1d8f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d900 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
1d910 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45  andle the SQLITE
1d920 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1d930 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   .** file-contro
1d940 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e  l operation.  En
1d950 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61  large the databa
1d960 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20  se to nBytes in 
1d970 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64  size.** (rounded
1d980 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
1d990 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66  chunk-size).  If
1d9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d9b0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74   already.** nByt
1d9c0 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68  es or larger, th
1d9d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1d9e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1d9f0 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69   int fcntlSizeHi
1da00 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  nt(unixFile *pFi
1da10 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  le, i64 nByte){.
1da20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1da30 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36  hunk>0 ){.    i6
1da40 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
1da50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1da60 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1da70 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
1da80 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
1da90 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1daa0 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
1dab0 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
1dac0 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f  */.   .    if( o
1dad0 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
1dae0 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
1daf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1db00 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d  AT;..    nSize =
1db10 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1db20 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1db30 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1db40 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1db50 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1db60 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1db70 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1db80 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1db90 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1dba0 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1dbb0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1dbc0 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1dbd0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1dbe0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1dbf0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1dc00 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1dc10 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1dc20 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1dc30 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1dc40 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1dc50 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1dc60 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1dc70 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1dc80 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1dc90 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1dca0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1dcb0 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1dcc0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1dcd0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1dce0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1dcf0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1dd00 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1dd10 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
1dd20 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1dd30 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1dd40 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1dd50 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1dd60 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1dd70 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20  it. First use.  
1dd80 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65      ** ftruncate
1dd90 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69  () to set the fi
1dda0 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72  le size, then wr
1ddb0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ite a single byt
1ddc0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  e to.      ** th
1ddd0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1dde0 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e  ach block within
1ddf0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1de00 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20  gion. This.     
1de10 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1de20 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62  technique used b
1de30 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65  y glibc to imple
1de40 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  ment posix_fallo
1de50 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  cate().      ** 
1de60 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  on systems that 
1de70 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
1de80 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73  al fallocate() s
1de90 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20  ystem call..    
1dea0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1deb0 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1dec0 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1ded0 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1dee0 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1def0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1df00 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1df10 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1df20 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72   */..      if( r
1df30 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1df40 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29  pFile->h, nSize)
1df50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1df60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1df70 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
1df80 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1df90 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1dfa0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1dfb0 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1dfc0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1dfd0 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
1dfe0 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
1dff0 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
1e000 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c  lk-1;.      whil
1e010 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20  e( iWrite<nSize 
1e020 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1e030 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
1e040 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
1e050 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
1e060 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
1e070 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1e080 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1e090 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d         iWrite +=
1e0a0 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23   nBlk;.      }.#
1e0b0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1e0c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1e0d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
1e0e0 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1e0f0 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e  eMax>0 && nByte>
1e100 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1e110 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1e120 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
1e130 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20  Chunk<=0 ){.    
1e140 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1e150 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1e160 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
1e170 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1e180 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1e190 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1e1a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1e1b0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1e1c0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1e1d0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1e1e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
1e1f0 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
1e200 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  pFile, nByte);. 
1e210 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e220 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1e230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e240 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
1e250 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
1e260 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
1e270 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
1e280 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
1e290 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
1e2a0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1e2b0 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
1e2c0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
1e2d0 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
1e2e0 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
1e2f0 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
1e300 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
1e310 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1e320 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
1e330 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28  oid unixModeBit(
1e340 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1e350 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
1e360 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
1e370 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
1e380 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
1e390 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e3a0 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
1e3b0 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
1e3c0 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
1e3d0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
1e3e0 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
1e3f0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1e400 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
1e410 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1e420 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
1e430 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
1e440 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
1e450 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a  , char *zBuf);..
1e460 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1e470 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1e480 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1e490 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1e4a0 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1e4b0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1e4c0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1e4d0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69  id *pArg){.  uni
1e4e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1e4f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1e500 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1e510 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e520 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
1e530 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1e540 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  rg = pFile->eFil
1e550 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
1e560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e570 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e580 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
1e590 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1e5a0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  pArg = pFile->la
1e5b0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
1e5c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e5d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e5e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
1e5f0 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
1e600 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1e610 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1e620 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e630 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e640 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e650 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1e660 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1e670 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1e680 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1e690 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53       rc = fcntlS
1e6a0 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a  izeHint(pFile, *
1e6b0 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
1e6c0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1e6d0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
1e6e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e6f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e700 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
1e710 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
1e720 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
1e730 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  e, UNIXFILE_PERS
1e740 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70  IST_WAL, (int*)p
1e750 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
1e760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e770 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1e780 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
1e790 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b  AFE_OVERWRITE: {
1e7a0 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1e7b0 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1e7c0 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
1e7d0 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
1e7e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e7f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1e800 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
1e810 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61  E: {.      *(cha
1e820 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
1e830 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
1e840 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e   pFile->pVfs->zN
1e850 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1e860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e870 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1e880 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
1e890 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
1e8a0 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73  char *zTFile = s
1e8b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
1e8c0 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1e8d0 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  thname );.      
1e8e0 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20  if( zTFile ){.  
1e8f0 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d        unixGetTem
1e900 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
1e910 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
1e920 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  TFile);.        
1e930 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1e940 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
1e950 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e960 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e970 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e980 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b  NTL_HAS_MOVED: {
1e990 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1e9a0 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65  rg = fileHasMove
1e9b0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  d(pFile);.      
1e9c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e9d0 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
1e9e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1e9f0 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
1ea00 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1ea10 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20  ZE: {.      i64 
1ea20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34  newLimit = *(i64
1ea30 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e  *)pArg;.      in
1ea40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ea50 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
1ea60 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62  imit>sqlite3Glob
1ea70 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
1ea80 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
1ea90 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  mit = sqlite3Glo
1eaa0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1eab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1eac0 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46  *(i64*)pArg = pF
1ead0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1eae0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
1eaf0 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69  imit>=0 && newLi
1eb00 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70  mit!=pFile->mmap
1eb10 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65  SizeMax && pFile
1eb20 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
1eb30 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1eb40 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e  >mmapSizeMax = n
1eb50 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  ewLimit;.       
1eb60 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70   if( pFile->mmap
1eb70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1eb80 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
1eb90 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
1eba0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70      rc = unixMap
1ebb0 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b  file(pFile, -1);
1ebc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ebd0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1ebe0 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  rc;.    }.#endif
1ebf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ec00 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20  EBUG.    /* The 
1ec10 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73  pager calls this
1ec20 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61   method to signa
1ec30 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f  l that it has do
1ec40 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c  ne.    ** a roll
1ec50 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1ec60 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  e database is th
1ec70 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65  erefore unchange
1ec80 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20  d and.    ** it 
1ec90 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66  hence it is OK f
1eca0 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  or the transacti
1ecb0 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  on change counte
1ecc0 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  r to be.    ** u
1ecd0 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f  nchanged..    */
1ece0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ecf0 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1ed00 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75  GED: {.      ((u
1ed10 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62  nixFile*)id)->db
1ed20 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
1ed30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ed40 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1ed50 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1ed60 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1ed70 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1ed80 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
1ed90 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1eda0 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1edb0 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
1edc0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
1edd0 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
1ede0 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c  yFileControl(id,
1edf0 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  op,pArg);.    }.
1ee00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ee10 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1ee20 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1ee30 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
1ee40 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ee50 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
1ee60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ee70 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
1ee80 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
1ee90 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
1eea0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
1eeb0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
1eec0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
1eed0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
1eee0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
1eef0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
1ef00 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
1ef10 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
1ef20 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
1ef30 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
1ef40 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
1ef50 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
1ef60 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
1ef70 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
1ef80 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
1ef90 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
1efa0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
1efb0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
1efc0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
1efd0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
1efe0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
1eff0 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  #ifndef __QNXNTO
1f000 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __ .static int u
1f010 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1f020 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1f030 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1f040 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1f050 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1f060 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1f070 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66  R_SIZE;.}.#endif
1f080 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1f090 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66  owing version of
1f0a0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1f0b0 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66  ) is optimized f
1f0c0 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65  or QNX..*/.#ifde
1f0d0 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e  f __QNXNTO__.#in
1f0e0 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f  clude <sys/dcmd_
1f0f0 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  blk.h>.#include 
1f100 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a  <sys/statvfs.h>.
1f110 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1f120 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1f130 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
1f140 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1f150 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1f160 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63    if( pFile->sec
1f170 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a  torSize == 0 ){.
1f180 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 76      struct statv
1f190 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
1f1a0 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65    .    /* Set de
1f1b0 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73  faults for non-s
1f1c0 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73  upported filesys
1f1d0 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c  tems */.    pFil
1f1e0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1f1f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1f200 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20  ECTOR_SIZE;.    
1f210 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f220 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
1f230 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 76  ;.    if( fstatv
1f240 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73  fs(pFile->h, &fs
1f250 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a  Info) == -1 ) {.
1f260 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 46 69        return pFi
1f270 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  le->sectorSize;.
1f280 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
1f290 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1f2a0 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29  basetype, "tmp")
1f2b0 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
1f2c0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f2d0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f2e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f2f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f300 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
1f310 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34  TE_IOCAP_ATOMIC4
1f320 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  K |       /* All
1f330 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1f340 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
1f350 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
1f360 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1f370 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1f380 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1f390 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1f3a0 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1f3d0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1f3e0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1f3f0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1f400 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1f410 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1f420 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1f430 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1f460 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1f470 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1f480 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28  else if( strstr(
1f490 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f4a0 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20  e, "etfs") ){.  
1f4b0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f4c0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f4d0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f4e0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f4f0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f500 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75       /* etfs clu
1f510 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65 73  ster size writes
1f520 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1f530 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73         (pFile->s
1f540 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
1f550 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
1f560 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20  TOMIC512) |.    
1f570 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f580 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
1f590 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
1f5a0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
1f5b0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5e0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
1f5f0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
1f600 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1f610 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
1f620 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
1f630 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
1f640 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f670 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
1f680 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
1f690 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1f6a0 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
1f6b0 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36  _basetype, "qnx6
1f6c0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
1f6d0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1f6e0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1f6f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1f700 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f710 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
1f720 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f730 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c   |         /* Al
1f740 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  l filesystem wri
1f750 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
1f760 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f770 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1f780 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1f790 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1f7a0 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1f7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1f7e0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1f7f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f800 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1f810 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1f820 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1f830 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
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 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1f870 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1f880 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1f890 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
1f8a0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1f8b0 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20   "qnx4") ){.    
1f8c0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f8d0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1f8e0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1f8f0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f900 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1f910 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
1f920 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
1f930 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
1f940 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
1f950 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
1f960 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1f970 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1f980 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
1f990 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
1f9a0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f9b0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f9c0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f9d0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f9e0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1fa10 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1fa20 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1fa30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1fa40 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
1fa50 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20  asetype, "dos") 
1fa60 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1fa70 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1fa80 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1fa90 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1faa0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1fab0 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c  =.        /* ful
1fac0 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d  l bitset of atom
1fad0 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63  ics from max sec
1fae0 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61  tor size and sma
1faf0 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ller */.        
1fb00 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ((pFile->sectorS
1fb10 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
1fb20 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1fb30 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a  12) << 1) - 2 |.
1fb40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1fb50 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1fb60 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1fb70 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1fb80 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1fbc0 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1fbd0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1fbe0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1fbf0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1fc00 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1fc10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fc20 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a  MIC512 |      /*
1fc30 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d   blocks are atom
1fc40 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1fc50 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1fc60 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1fc70 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1fc80 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1fc90 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1fcc0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1fcd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1fce0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61     }.  }.  /* La
1fcf0 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66 69  st chance verifi
1fd00 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  cation.  If the 
1fd10 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27  sector size isn'
1fd20 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  t a multiple of 
1fd30 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  512.  ** then it
1fd40 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a   isn't valid.*/.
1fd50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63    if( pFile->sec
1fd60 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d  torSize % 512 !=
1fd70 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
1fd80 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fd90 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20  istics = 0;.    
1fda0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fdb0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1fdc0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1fdd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69    }.  return pFi
1fde0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  le->sectorSize;.
1fdf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e  }.#endif /* __QN
1fe00 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XNTO__ */../*.**
1fe10 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
1fe20 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1fe30 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
1fe40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20  .**.** This VFS 
1fe50 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74  is set up to ret
1fe60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
1fe70 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1fe80 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e  RITE by default.
1fe90 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61  .** However, tha
1fea0 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74  t choice is cont
1feb0 72 61 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20  raversial since 
1fec0 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  technically the 
1fed0 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69  underlying.** fi
1fee0 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  le system does n
1fef0 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64  ot always provid
1ff00 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72  e powersafe over
1ff10 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68  writes.  (In oth
1ff20 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74  er.** words, aft
1ff30 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20  er a power-loss 
1ff40 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20  event, parts of 
1ff50 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
1ff60 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74  re never.** writ
1ff70 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70  ten might end up
1ff80 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29   being altered.)
1ff90 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50    However, non-P
1ffa0 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20  SOW behavior is 
1ffb0 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61  very,.** very ra
1ffc0 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69  re.  And asserti
1ffd0 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20  ng PSOW makes a 
1ffe0 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20  large reduction 
1fff0 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  in the amount.**
20000 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f   of required I/O
20010 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c   for journaling,
20020 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20   since a lot of 
20030 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69  padding is elimi
20040 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65  nated..**  Hence
20050 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46  , while POWERSAF
20060 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f  E_OVERWRITE is o
20070 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68  n by default, th
20080 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f  ere is a file-co
20090 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62  ntrol.** availab
200a0 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
200b0 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20  f and URI query 
200c0 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61  parameter availa
200d0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
200e0 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
200f0 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
20100 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
20110 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
20120 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
20130 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
20140 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64  int rc = 0;.#ifd
20150 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20  ef __QNXNTO__.  
20160 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a  if( p->sectorSiz
20170 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f  e==0 ) unixSecto
20180 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20  rSize(id);.  rc 
20190 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61  = p->deviceChara
201a0 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64  cteristics;.#end
201b0 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c  if.  if( p->ctrl
201c0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
201d0 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20  _PSOW ){.    rc 
201e0 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  |= SQLITE_IOCAP_
201f0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
20200 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ITE;.  }.  retur
20210 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
20220 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20230 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
20240 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
20250 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20260 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73  he system page s
20270 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
20280 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
20290 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69  not be called di
202a0 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20  rectly by other 
202b0 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
202c0 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  e. .** Instead, 
202d0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  it should be cal
202e0 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73  led via macro os
202f0 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a  Getpagesize()..*
20300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20310 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69  xGetpagesize(voi
20320 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
20330 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72  _BSD_SOURCE).  r
20340 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a  eturn getpagesiz
20350 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  e();.#else.  ret
20360 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66  urn (int)sysconf
20370 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a  (_SC_PAGESIZE);.
20380 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66  #endif.}..#endif
20390 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
203a0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
203b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
203c0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e  _SIZE>0 */..#ifn
203d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
203e0 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  WAL../*.** Objec
203f0 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
20400 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65  ent an shared me
20410 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a  mory buffer.  .*
20420 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70  *.** When multip
20430 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
20440 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
20450 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63  e wal-index, eac
20460 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20  h thread.** has 
20470 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20  its own unixShm 
20480 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
20490 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20   all point to a 
204a0 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a  single instance.
204b0 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53  ** of this unixS
204c0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20  hmNode object.  
204d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
204e0 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69  each wal-index i
204f0 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79  s opened.** only
20500 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
20510 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e  s..**.** Each un
20520 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20530 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
20540 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e   a single unixIn
20550 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
20560 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c  ** We could coal
20570 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74  esce this object
20580 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49   into unixInodeI
20590 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f  nfo, but that wo
205a0 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72  uld mean.** ever
205b0 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74  y open file that
205c0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68   does not use sh
205d0 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20  ared memory (in 
205e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73  other words, mos
205f0 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29  t.** open files)
20600 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63   would have to c
20610 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73  arry around this
20620 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
20630 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75  on.  So.** the u
20640 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
20650 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ect contains a p
20660 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75  ointer to this u
20670 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20680 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69  t.** and the uni
20690 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
206a0 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20  is created only 
206b0 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  when needed..**.
206c0 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
206d0 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
206e0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
206f0 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
20700 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
20710 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
20720 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
20730 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
20740 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a  **      nRef.**.
20750 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
20760 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
20770 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
20780 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
20790 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
207a0 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
207b0 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
207c0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75  r unixShmNode.mu
207d0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
207e0 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e   or unixShmNode.
207f0 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
20800 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
20810 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
20820 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
20830 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
20840 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
20850 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ure..*/.struct u
20860 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75  nixShmNode {.  u
20870 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
20880 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69  node;     /* uni
20890 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20  xInodeInfo that 
208a0 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f  owns this SHM no
208b0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
208c0 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
208d0 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
208e0 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
208f0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
20900 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
20910 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
20920 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
20930 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20950 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
20960 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
20970 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
20980 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20990 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
209a0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20  egions */.  u16 
209b0 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
209c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
209d0 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
209e0 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f   */.  u8 isReado
209f0 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
20a00 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
20a10 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20  -only */.  char 
20a20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  **apRegion;     
20a30 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
20a40 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d  f mapped shared-
20a50 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
20a60 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  * Number of unix
20a90 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
20aa0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
20ab0 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73    unixShm *pFirs
20ac0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
20ad0 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  All unixShm obje
20ae0 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
20af0 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  this */.#ifdef S
20b00 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
20b10 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
20b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20b30 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
20b40 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
20b50 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
20b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20b70 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
20b80 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65   held */.  u8 ne
20b90 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
20ba0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
20bb0 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e  ailable unixShm.
20bc0 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
20bd0 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72  if.};../*.** Str
20be0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
20bf0 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
20c00 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
20c10 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
20c20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
20c30 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
20c40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20c50 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
20c60 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
20c70 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
20c80 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
20c90 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
20ca0 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
20cb0 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a  unixShm.pFile.**
20cc0 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a      unixShm.id.*
20cd0 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
20ce0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
20cf0 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53  rite.  The unixS
20d00 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20  hm.pFile->mutex 
20d10 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
20d20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
20d30 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
20d40 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
20d50 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69   unixShm {.  uni
20d60 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
20d70 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75  de;     /* The u
20d80 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68  nderlying unixSh
20d90 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
20da0 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74    unixShm *pNext
20db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20dc0 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74  Next unixShm wit
20dd0 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53  h the same unixS
20de0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
20df0 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
20e00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20e10 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e  f holding the un
20e20 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  ixShmNode mutex 
20e30 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  */.  u8 id;     
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
20e60 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nnection within 
20e70 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  its unixShmNode 
20e80 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
20e90 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
20ea0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
20eb0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
20ec0 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ee0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
20ef0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
20f00 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
20f10 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
20f20 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
20f30 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20  UNIX_SHM_BASE   
20f40 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
20f50 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
20f60 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
20f70 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
20f80 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
20f90 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53  (UNIX_SHM_BASE+S
20fa0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
20fb0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
20fc0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
20fd0 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f  ply posix adviso
20fe0 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
20ff0 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74   bytes from ofst
21000 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d   through ofst+n-
21010 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62  1..**.** Locks b
21020 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b  lock if the mask
21030 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58   is exactly UNIX
21040 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e  _SHM_C and are n
21050 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  on-blocking.** o
21060 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
21070 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
21080 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69  ystemLock(.  uni
21090 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
210a0 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63  de, /* Apply loc
210b0 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
210c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
210d0 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
210e0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
210f0 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
21100 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
21110 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21130 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
21140 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
21150 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21170 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
21180 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
21190 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
211a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
211b0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
211c0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
211d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
211e0 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75  TE_OK;   /* Resu
211f0 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
21200 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
21210 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
21220 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
21230 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
21240 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
21250 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21260 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
21270 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ode->mutex) || p
21280 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
21290 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
212a0 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
212b0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
212c0 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
212d0 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
212e0 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
212f0 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
21300 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
21310 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
21320 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   n<SQLITE_SHM_NL
21330 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
21340 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
21350 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
21360 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
21370 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
21380 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
21390 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
213a0 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
213b0 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
213c0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
213d0 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
213e0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
213f0 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
21400 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
21410 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
21420 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
21430 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
21440 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
21450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
21460 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
21470 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
21480 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
21490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
214a0 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
214b0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
214c0 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
214d0 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30  sk = ofst>31 ? 0
214e0 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73  xffff : (1<<(ofs
214f0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
21500 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
21520 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
21530 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
21540 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
21550 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21560 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21570 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
21580 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21590 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
215a0 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  mask;.    }else 
215b0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
215c0 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
215d0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
215e0 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
215f0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
21600 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
21610 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
21620 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
21630 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65   |= mask;.    }e
21640 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
21650 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
21660 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
21670 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
21680 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
21690 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
216a0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  e->exclMask |= m
216b0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
216c0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
216d0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a  &= ~mask;.    }.
216e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
216f0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
21700 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
21710 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
21720 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
21730 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
21740 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
21750 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21760 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61  E(("read-lock fa
21770 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
21780 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21790 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
217a0 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
217b0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
217c0 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
217d0 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
217e0 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61    OSTRACE((" - a
217f0 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25  fterwards %03x,%
21800 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
21810 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
21820 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64  redMask, pShmNod
21830 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  e->exclMask));. 
21840 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
21850 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
21860 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21870 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62  the minimum numb
21880 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72  er of 32KB shm r
21890 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75  egions that shou
218a0 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a  ld be mapped at.
218b0 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d  ** a time, assum
218c0 69 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d 61  ing that each ma
218d0 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e  pping must be an
218e0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
218f0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  e of the.** curr
21900 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d  ent system page-
21910 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61  size..**.** Usua
21920 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20  lly, this is 1. 
21930 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65  The exception se
21940 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d  ems to be system
21950 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69  s that are confi
21960 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20  gured.** to use 
21970 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20  64KB pages - in 
21980 74 68 69 73 20 63 61 73 65 20 65 61 63 68 20 6d  this case each m
21990 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65  apping must cove
219a0 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a  r at least two.*
219b0 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a  * shm regions..*
219c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
219d0 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70  xShmRegionPerMap
219e0 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68  (void){.  int sh
219f0 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20  msz = 32*1024;  
21a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d            /* SHM
21a10 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a   region size */.
21a20 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47    int pgsz = osG
21a30 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20  etpagesize();   
21a40 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20 73  /* System page s
21a50 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ize */.  assert(
21a60 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29   ((pgsz-1)&pgsz)
21a70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65  ==0 );   /* Page
21a80 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
21a90 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20  power of 2 */.  
21aa0 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29  if( pgsz<shmsz )
21ab0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
21ac0 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a  urn pgsz/shmsz;.
21ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  }../*.** Purge t
21ae0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
21af0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
21b00 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
21b10 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
21b20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
21b30 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
21b40 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
21b50 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
21b60 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
21b70 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
21b80 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
21b90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
21ba0 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
21bb0 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
21bc0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
21bd0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
21be0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
21bf0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
21c00 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
21c10 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
21c20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d  int nShmPerMap =
21c30 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65   unixShmRegionPe
21c40 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20  rMap();.    int 
21c50 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
21c60 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70  ->pInode==pFd->p
21c70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c  Inode );.    sql
21c80 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
21c90 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66  p->mutex);.    f
21ca0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
21cb0 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72  gion; i+=nShmPer
21cc0 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Map){.      if( 
21cd0 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
21ce0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61     osMunmap(p->a
21cf0 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73  pRegion[i], p->s
21d00 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
21d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
21d20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
21d30 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20  pRegion[i]);.   
21d40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
21d50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
21d60 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66  pRegion);.    if
21d70 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ( p->h>=0 ){.   
21d80 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
21d90 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e  pFd, p->h, __LIN
21da0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68  E__);.      p->h
21db0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
21dc0 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d   p->pInode->pShm
21dd0 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Node = 0;.    sq
21de0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
21df0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
21e00 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
21e10 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
21e20 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62   with open datab
21e30 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20  ase file pDbFd. 
21e40 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63   .** This partic
21e50 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ular implementat
21e60 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64  ion uses mmapped
21e70 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
21e80 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69  e file used to i
21e90 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d  mplement shared-
21ea0 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65  memory is in the
21eb0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a   same directory.
21ec0 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  ** as the open d
21ed0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
21ee0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
21ef0 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  me as the open d
21f00 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
21f10 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20  with the "-shm" 
21f20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46  suffix added.  F
21f30 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
21f40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21f50 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73  .** is "/home/us
21f60 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74  er1/config.db" t
21f70 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61  hen the file tha
21f80 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
21f90 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20   mmapped.** for 
21fa0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
21fb0 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68  ll be called "/h
21fc0 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
21fd0 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a  .db-shm".  .**.*
21fe0 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61  * Another approa
21ff0 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20  ch to is to use 
22000 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68  files in /dev/sh
22010 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72  m or /dev/tmp or
22020 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65   an.** some othe
22030 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42  r tmpfs mount. B
22040 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20  ut if a file in 
22050 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65  a different dire
22060 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68  ctory.** from th
22070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22080 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69  is used, then di
22090 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70  ffering access p
220a0 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72  ermissions.** or
220b0 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68   a chroot() migh
220c0 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66  t cause two diff
220d0 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20  erent processes 
220e0 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64  on the same.** d
220f0 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75  atabase to end u
22100 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e  p using differen
22110 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72  t files for shar
22120 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20  ed memory - .** 
22130 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
22140 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20  ir memory would 
22150 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68  not really be sh
22160 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67  ared - resulting
22170 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20  .** in database 
22180 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76  corruption.  Nev
22190 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20  ertheless, this 
221a0 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65  tmpfs file usage
221b0 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c  .** can be enabl
221c0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
221d0 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
221e0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d  E_SHM_DIRECTORY=
221f0 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72  "/dev/shm".** or
22200 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   the equivalent.
22210 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65    The use of the
22220 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22230 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
22240 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73  me.** option res
22250 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  ults in an incom
22260 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66  patible build of
22270 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73   SQLite;  builds
22280 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68   of SQLite.** th
22290 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e  at with differin
222a0 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  g SQLITE_SHM_DIR
222b0 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20  ECTORY settings 
222c0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74  attempt to use t
222d0 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62  he.** same datab
222e0 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
222f0 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62  same time, datab
22300 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
22310 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
22320 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45  sult. The SQLITE
22330 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
22340 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
22350 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  on is considered
22360 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64  .** "unsupported
22370 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61  " and may go awa
22380 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51  y in a future SQ
22390 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a  Lite release..**
223a0 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
223b0 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
223c0 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
223d0 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
223e0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
223f0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
22400 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
22410 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
22420 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
22430 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
22440 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
22450 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
22460 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
22470 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
22480 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
22490 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70  database file (p
224a0 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74  DbFd) is using t
224b0 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56  he "unix-excl" V
224c0 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73  FS.** that means
224d0 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69   that an exclusi
224e0 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ve lock is held 
224f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22500 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74  file and.** that
22510 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
22520 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ses are able to 
22530 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
22540 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a  e database.  In.
22550 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65  ** that case, we
22560 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e   do not really n
22570 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  eed shared memor
22580 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65  y.  No shared me
22590 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20  mory.** file is 
225a0 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68  created.  The sh
225b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
225c0 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69   be simulated wi
225d0 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a  th heap memory..
225e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
225f0 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
22600 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  ry(unixFile *pDb
22610 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  Fd){.  struct un
22620 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20  ixShm *p = 0;   
22630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
22640 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
22650 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
22660 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70  t unixShmNode *p
22670 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68  ShmNode;   /* Th
22680 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
22690 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
226a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
226c0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
226d0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
226e0 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
226f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20     /* The inode 
22700 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  of fd */.  char 
22710 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20  *zShmFilename;  
22720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
22730 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75  me of the file u
22740 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20  sed for SHM */. 
22750 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d   int nShmFilenam
22760 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22770 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
22780 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  SHM filename in 
22790 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41  bytes */..  /* A
227a0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
227b0 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68  r the new unixSh
227c0 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70  m object. */.  p
227d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
227e0 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
227f0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
22800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22810 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
22820 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
22830 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
22840 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
22850 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
22860 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
22870 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
22880 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
22890 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
228a0 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
228b0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
228c0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
228d0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
228e0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
228f0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
22900 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f   pShmNode = pIno
22910 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
22920 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
22930 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
22940 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
22950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74            /* fst
22960 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61  at() info for da
22970 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
22980 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
22990 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
229a0 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
229b0 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
229c0 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
229d0 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
229e0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
229f0 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
22a00 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
22a10 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
22a20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
22a30 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ions..    */.   
22a40 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
22a50 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26  Fd->h, &sStat) &
22a60 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  & pInode->bProce
22a70 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
22a80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
22a90 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
22aa0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
22ab0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  err;.    }..#ifd
22ac0 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
22ad0 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d  RECTORY.    nShm
22ae0 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f  Filename = sizeo
22af0 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f(SQLITE_SHM_DIR
22b00 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65  ECTORY) + 31;.#e
22b10 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  lse.    nShmFile
22b20 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29  name = 6 + (int)
22b30 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50  strlen(pDbFd->zP
22b40 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ath);.#endif.   
22b50 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69   pShmNode = sqli
22b60 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
22b70 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
22b80 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
22b90 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
22ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
22bb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
22bc0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
22bd0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
22be0 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
22bf0 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
22c00 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
22c10 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
22c20 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
22c30 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
22c40 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
22c50 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  e[1];.#ifdef SQL
22c60 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22c70 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  Y.    sqlite3_sn
22c80 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
22c90 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
22ca0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
22cb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
22cc0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
22cd0 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
22ce0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22cf0 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
22d00 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
22d10 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
22d20 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
22d30 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
22d40 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
22d50 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
22d60 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
22d70 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
22d80 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
22d90 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  th, zShmFilename
22da0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53  );.#endif.    pS
22db0 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a  hmNode->h = -1;.
22dc0 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64      pDbFd->pInod
22dd0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  e->pShmNode = pS
22de0 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  hmNode;.    pShm
22df0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70  Node->pInode = p
22e00 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
22e10 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65    pShmNode->mute
22e20 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
22e30 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
22e40 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
22e50 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  if( pShmNode->mu
22e60 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
22e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
22e80 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
22e90 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
22ea0 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  }..    if( pInod
22eb0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
22ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
22ed0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
22ee0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
22ef0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
22f00 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46  uri_boolean(pDbF
22f10 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f  d->zPath, "reado
22f20 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a  nly_shm", 0) ){.
22f30 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67          openFlag
22f40 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
22f50 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
22f60 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
22f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
22f80 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75  hmNode->h = robu
22f90 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65  st_open(zShmFile
22fa0 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  name, openFlags,
22fb0 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26   (sStat.st_mode&
22fc0 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66  0777));.      if
22fd0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
22fe0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22ff0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
23000 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
23010 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46  T, "open", zShmF
23020 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
23030 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
23040 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  err;.      }..  
23050 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
23060 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
23070 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20  g as root, make 
23080 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48  sure that the SH
23090 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  M file.      ** 
230a0 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  is owned by the 
230b0 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f  same user that o
230c0 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  wns the original
230d0 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65   database.  Othe
230e0 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
230f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e  the original own
23100 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  er will not be a
23110 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a  ble to connect..
23120 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6f        */.      o
23130 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65  sFchown(pShmNode
23140 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69  ->h, sStat.st_ui
23150 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29  d, sStat.st_gid)
23160 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68  ;.  .      /* Ch
23170 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
23180 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
23190 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
231a0 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
231b0 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
231c0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
231d0 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
231e0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
231f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23200 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53  .      if( unixS
23210 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
23220 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  mNode, F_WRLCK, 
23230 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
23240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23250 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73         if( robus
23260 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
23270 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20  Node->h, 0) ){. 
23280 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
23290 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
232a0 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
232b0 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53   "ftruncate", zS
232c0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
232d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
232e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
232f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23300 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
23310 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
23320 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  e, F_RDLCK, UNIX
23330 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
23340 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23350 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
23360 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
23370 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
23380 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
23390 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
233a0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
233b0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
233c0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
233d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
233e0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
233f0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
23400 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
23410 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
23420 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
23430 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
23440 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
23450 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
23460 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
23470 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
23480 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
23490 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
234a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
234b0 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
234c0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
234d0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
234e0 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
234f0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
23500 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
23510 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
23520 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
23530 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
23540 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
23550 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
23560 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
23570 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
23580 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
23590 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
235a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
235b0 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
235c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
235d0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
235e0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
235f0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
23600 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
23610 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
23620 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23630 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
23640 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
23650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
23660 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
23670 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
23680 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
23690 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
236a0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
236b0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
236c0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
236d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
236e0 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
236f0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
23700 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
23710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23720 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
23730 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
23740 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
23750 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
23760 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
23770 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
23780 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
23790 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
237a0 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
237b0 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
237c0 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
237d0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
237e0 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
237f0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
23800 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
23810 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
23820 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
23830 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
23840 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
23850 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
23860 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
23870 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
23880 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
23890 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
238a0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
238b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
238c0 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
238d0 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
238e0 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
238f0 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
23900 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
23910 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
23920 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
23930 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
23940 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
23950 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
23960 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
23970 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
23980 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
23990 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
239a0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
239b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
239c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
239d0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
239e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
239f0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
23a00 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
23a10 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
23a20 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
23a30 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
23a40 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
23a50 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
23a60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
23a70 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
23a80 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
23a90 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
23aa0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
23ab0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
23ac0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
23ad0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
23ae0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
23af0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
23b00 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
23b10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
23b20 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
23b30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
23b40 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
23b50 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
23b80 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
23b90 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
23ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23bb0 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
23bc0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
23bd0 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
23be0 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
23bf0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
23c00 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
23c10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
23c20 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
23c30 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
23c40 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
23c50 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
23c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23c70 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
23c80 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
23c90 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e 74 20  PerMap();.  int 
23ca0 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f  nReqRegion;..  /
23cb0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
23cc0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20  memory file has 
23cd0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
23ce0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
23cf0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64  . */.  if( pDbFd
23d00 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->pShm==0 ){.   
23d10 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68   rc = unixOpenSh
23d20 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
23d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
23d40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
23d50 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  n rc;.  }..  p =
23d60 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
23d70 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
23d80 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  hmNode;.  sqlite
23d90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
23da0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23db0 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
23dc0 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
23dd0 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
23de0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
23df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23e00 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
23e10 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
23e20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
23e30 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
23e40 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
23e50 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
23e60 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
23e70 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
23e80 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
23e90 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ock==0 );..  /* 
23ea0 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Minimum number o
23eb0 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72  f regions requir
23ec0 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e  ed to be mapped.
23ed0 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e   */.  nReqRegion
23ee0 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68   = ((iRegion+nSh
23ef0 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50  mPerMap) / nShmP
23f00 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72  erMap) * nShmPer
23f10 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  Map;..  if( pShm
23f20 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
23f30 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
23f40 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f60 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
23f70 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
23f80 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52    int nByte = nR
23f90 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  eqRegion*szRegio
23fa0 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  n;   /* Minimum 
23fb0 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
23fc0 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
23fd0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ff0 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
24000 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
24010 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
24020 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
24030 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
24040 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
24050 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
24060 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
24070 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
24080 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
24090 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
240a0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
240b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
240c0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
240d0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
240e0 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
240f0 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
24100 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
24110 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
24120 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
24130 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
24140 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
24150 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
24160 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
24170 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24180 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
24190 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
241a0 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
241b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
241c0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
241d0 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
241e0 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
241f0 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
24200 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
24210 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
24220 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
24230 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
24240 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
24250 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24260 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a  if( !bExtend ){.
24270 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
24280 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24290 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
242a0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
242b0 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
242c0 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20  rue, extend the 
242d0 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79  file. Do this by
242e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74  .        ** writ
242f0 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
24300 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
24310 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62  each (OS) page b
24320 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  eing.        ** 
24330 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74  allocated or ext
24340 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c  ended. Technical
24350 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79  ly, we need only
24360 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
24370 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61        ** last pa
24380 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  ge in order to e
24390 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20  xtend the file. 
243a0 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61  But writing to a
243b0 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  ll new.        *
243c0 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74  * pages forces t
243d0 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74  he OS to allocat
243e0 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65  e them immediate
243f0 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65  ly, which reduce
24400 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  s.        ** the
24410 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42   chances of SIGB
24420 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  US while accessi
24430 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  ng the mapped re
24440 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20  gion later on.. 
24450 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24460 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
24470 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
24480 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a  nt pgsz = 4096;.
24490 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
244a0 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  g;..          /*
244b0 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61   Write to the la
244c0 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20  st byte of each 
244d0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
244e0 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65  or extended page
244f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
24500 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70  sert( (nByte % p
24510 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  gsz)==0 );.     
24520 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53       for(iPg=(sS
24530 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a  tat.st_size/pgsz
24540 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67  ); iPg<(nByte/pg
24550 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  sz); iPg++){.   
24560 20 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65           if( see
24570 6b 41 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d  kAndWriteFd(pShm
24580 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73  Node->h, iPg*pgs
24590 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20  z + pgsz-1, "", 
245a0 31 2c 20 30 29 21 3d 31 20 29 7b 0a 20 20 20 20  1, 0)!=1 ){.    
245b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
245c0 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53  char *zFile = pS
245d0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
245e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
245f0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
24600 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
24610 53 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22  SHMSIZE, "write"
24620 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
24630 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
24640 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
24650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24660 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
24680 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
24690 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
246a0 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
246b0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
246c0 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
246d0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73  New = (char **)s
246e0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
246f0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
24700 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71  ->apRegion, nReq
24710 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68  Region*sizeof(ch
24720 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20  ar *).    );.   
24730 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
24740 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24750 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
24760 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
24770 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
24780 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
24790 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
247a0 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
247b0 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
247c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ion ){.      int
247d0 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e   nMap = szRegion
247e0 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20  *nShmPerMap;.   
247f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
24800 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
24810 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
24820 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
24830 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pMem = osMmap(0,
24840 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20   nMap,.         
24850 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
24860 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52  eadonly ? PROT_R
24870 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c  EAD : PROT_READ|
24880 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
24890 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
248a0 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
248b0 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29  , szRegion*(i64)
248c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
248d0 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
248e0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
248f0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
24900 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
24910 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24920 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d  IOERR_SHMMAP, "m
24930 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  map", pShmNode->
24940 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
24950 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
24960 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24970 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
24980 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71         pMem = sq
24990 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52  lite3_malloc(szR
249a0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
249b0 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
249c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
249d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
249e0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
249f0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24a00 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
24a10 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
24a20 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  on);.      }..  
24a30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
24a40 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b  ShmPerMap; i++){
24a50 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
24a60 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
24a70 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d  Node->nRegion+i]
24a80 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d   = &((char*)pMem
24a90 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20  )[szRegion*i];. 
24aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
24ab0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b  mNode->nRegion +
24ac0 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  = nShmPerMap;.  
24ad0 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
24ae0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
24af0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
24b00 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
24b10 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
24b20 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
24b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
24b40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
24b50 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
24b60 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
24b70 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
24b80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
24b90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
24ba0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
24bb0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
24bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
24bd0 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
24be0 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
24bf0 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
24c00 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
24c10 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
24c20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
24c30 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
24c40 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
24c50 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
24c60 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
24c70 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
24c80 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
24c90 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
24ca0 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
24cb0 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
24cc0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
24cd0 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
24ce0 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
24cf0 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
24d00 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
24d10 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
24d20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24d30 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
24d40 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
24d50 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
24d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
24d70 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
24d80 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
24d90 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
24da0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
24db0 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
24dc0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
24dd0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
24de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24df0 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
24e00 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
24e10 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
24e20 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
24e30 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
24e40 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
24e50 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
24e60 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
24e70 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
24e80 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
24e90 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
24ea0 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
24eb0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ed0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
24ee0 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
24ef0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
24f20 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
24f30 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
24f40 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
24f50 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
24f60 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
24f70 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
24f80 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
24f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fb0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
24fc0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
24ff0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
25000 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
25010 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
25020 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
25030 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
25040 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25050 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
25060 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
25070 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
25080 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
25090 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
250a0 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
250b0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
250c0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
250d0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
250e0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
250f0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
25100 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
25110 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
25120 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
25130 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
25140 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
25150 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
25160 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
25170 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
25180 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
25190 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
251a0 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
251b0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
251c0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
251d0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
251e0 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
251f0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
25200 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
25210 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
25220 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
25230 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
25240 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
25250 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
25260 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
25270 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
25280 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
25290 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
252a0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
252b0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
252c0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
252d0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
252e0 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
252f0 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
25300 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
25310 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
25320 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
25330 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
25340 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
25350 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
25360 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
25370 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
25380 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
25390 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
253a0 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
253b0 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
253c0 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
253d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
253e0 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
253f0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
25400 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
25410 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
25420 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
25430 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
25440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
25450 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
25460 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
25470 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
25480 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
25490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
254a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
254b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
254c0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
254d0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
254e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
254f0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
25500 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
25510 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
25520 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
25530 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
25540 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
25550 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
25560 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
25570 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
25580 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
25590 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
255a0 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
255b0 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
255c0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
255d0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
255e0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
255f0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
25600 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
25610 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
25620 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
25630 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
25640 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
25650 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
25660 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
25670 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
25680 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
25690 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
256a0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
256b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
256c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
256d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
256e0 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
256f0 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
25700 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
25710 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
25720 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
25730 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
25740 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
25750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25760 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
25770 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
25780 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
25790 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
257a0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
257b0 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
257c0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
257d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
257e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
257f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
25800 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
25810 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
25820 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
25830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25840 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
25850 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
25860 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
25870 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
25880 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
25890 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
258a0 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
258b0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
258c0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
258d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
258e0 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
258f0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
25900 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
25910 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
25920 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
25930 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
25940 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
25950 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
25960 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
25970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
25980 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
25990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
259a0 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
259b0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
259c0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
259d0 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
259e0 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
259f0 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
25a00 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
25a10 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
25a20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25a40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
25a50 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
25a60 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
25a70 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
25a80 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
25a90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25aa0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
25ab0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
25ac0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
25ad0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
25ae0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
25af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25b00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
25b10 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
25b20 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
25b30 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
25b40 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
25b50 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
25b60 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
25b70 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e  d, getpid(), p->
25b80 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
25b90 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
25ba0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25bb0 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
25bc0 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
25bd0 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
25be0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
25bf0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
25c00 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
25c10 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
25c20 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
25c30 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
25c40 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
25c50 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
25c60 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
25c70 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
25c80 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
25c90 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
25ca0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
25cb0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
25cc0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
25cd0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
25ce0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
25cf0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
25d00 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  x();.  unixLeave
25d10 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
25d20 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
25d30 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
25d40 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
25d50 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
25d60 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
25d70 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
25d80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
25d90 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
25da0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
25db0 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
25dc0 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
25dd0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
25de0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
25df0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25e00 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
25e10 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
25e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25e30 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
25e40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
25e50 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e70 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
25e80 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
25e90 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
25ea0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
25eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
25ec0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
25ed0 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
25ee0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
25ef0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
25f00 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
25f10 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
25f20 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
25f30 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
25f40 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
25f50 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
25f60 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
25f70 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
25f80 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
25f90 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
25fa0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
25fb0 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
25fc0 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
25fd0 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
25fe0 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
25ff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26000 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
26010 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
26020 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
26030 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
26040 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
26050 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
26060 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
26070 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
26080 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
26090 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
260a0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
260b0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
260c0 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
260d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
260e0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
260f0 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
26100 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
26110 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
26120 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
26130 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
26140 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
26150 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
26160 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
26170 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
26180 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
26190 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
261a0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
261b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
261c0 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
261d0 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
261e0 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
261f0 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
26200 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
26210 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
26220 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
26230 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
26240 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
26250 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
26260 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
26270 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
26280 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
26290 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e  ode->h>=0 ) osUn
262a0 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  link(pShmNode->z
262b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75  Filename);.    u
262c0 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
262d0 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
262e0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
262f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26300 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
26310 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
26320 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
26330 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
26340 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
26350 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
26360 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
26370 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
26380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26390 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  _WAL */..#if SQL
263a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
263b0 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  E>0./*.** If it 
263c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d  is currently mem
263d0 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61  ory mapped, unma
263e0 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73  p file pFd..*/.s
263f0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
26400 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
26410 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
26420 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
26430 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t==0 );.  if( pF
26440 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  d->pMapRegion ){
26450 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46  .    osMunmap(pF
26460 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70  d->pMapRegion, p
26470 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26480 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d  al);.    pFd->pM
26490 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
264a0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
264b0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
264c0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
264d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
264e0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
264f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  e size of the me
26500 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69  mory mapping mai
26510 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20  ntained by file 
26520 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
26530 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73  Fd to nNew bytes
26540 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  . Any existing m
26550 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72  apping is discar
26560 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ded..**.** If su
26570 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
26580 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
26590 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
265a0 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bles:.**.**     
265b0 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52    unixFile.pMapR
265c0 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75  egion.**       u
265d0 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
265e0 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
265f0 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  le.mmapSizeActua
26600 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63  l.**.** If unsuc
26610 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f  cessful, an erro
26620 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67  r message is log
26630 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  ged via sqlite3_
26640 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65  log() and.** the
26650 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
26660 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65   above are zeroe
26670 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
26680 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a  SQLite should.**
26690 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73   continue access
266a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
266b0 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64   using the xRead
266c0 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a  () and xWrite().
266d0 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ** methods..*/.s
266e0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52  tatic void unixR
266f0 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78  emapfile(.  unix
26700 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20  File *pFd,      
26710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26720 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
26730 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e  bject */.  i64 n
26740 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20  New             
26750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26760 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73  quired mapping s
26770 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ize */.){.  cons
26780 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
26790 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d  mmap";.  int h =
267a0 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20   pFd->h;        
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
267c0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
267d0 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65   open on db file
267e0 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20   */.  u8 *pOrig 
267f0 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  = (u8 *)pFd->pMa
26800 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f  pRegion;   /* Po
26810 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
26820 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f   file mapping */
26830 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70  .  i64 nOrig = p
26840 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26850 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
26860 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20  of pOrig region 
26870 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
26880 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f     /* Location o
268b0 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f  f new mapping */
268c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50  .  int flags = P
268d0 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20  ROT_READ;       
268e0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
268f0 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70   to pass to mmap
26900 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  () */..  assert(
26910 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
26920 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26930 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nNew>pFd->mmapSi
26940 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
26950 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53  nNew<=pFd->mmapS
26960 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65  izeMax );.  asse
26970 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
26980 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61  assert( pFd->mma
26990 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64  pSizeActual>=pFd
269a0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
269b0 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
269c0 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ED!=0 );..  if( 
269d0 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
269e0 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
269f0 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
26a00 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20 20   PROT_WRITE;..  
26a10 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66  if( pOrig ){.#if
26a20 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
26a30 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46   i64 nReuse = pF
26a40 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c  d->mmapSize;.#el
26a50 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
26a60 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47   szSyspage = osG
26a70 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20  etpagesize();.  
26a80 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28    i64 nReuse = (
26a90 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20  pFd->mmapSize & 
26aa0 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b  ~(szSyspage-1));
26ab0 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
26ac0 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52  pReq = &pOrig[nR
26ad0 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55  euse];..    /* U
26ae0 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f  nmap any pages o
26af0 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  f the existing m
26b00 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e  apping that cann
26b10 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f  ot be reused. */
26b20 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65 21  .    if( nReuse!
26b30 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  =nOrig ){.      
26b40 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e  osMunmap(pReq, n
26b50 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20  Orig-nReuse);.  
26b60 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52    }..#if HAVE_MR
26b70 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20  EMAP.    pNew = 
26b80 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20  osMremap(pOrig, 
26b90 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52  nReuse, nNew, MR
26ba0 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20  EMAP_MAYMOVE);. 
26bb0 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61     zErr = "mrema
26bc0 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p";.#else.    pN
26bd0 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71  ew = osMmap(pReq
26be0 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66  , nNew-nReuse, f
26bf0 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
26c00 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  , h, nReuse);.  
26c10 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f    if( pNew!=MAP_
26c20 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
26c30 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29  if( pNew!=pReq )
26c40 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
26c50 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20  ap(pNew, nNew - 
26c60 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20  nReuse);.       
26c70 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20   pNew = 0;.     
26c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26c90 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20  pNew = pOrig;.  
26ca0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
26cb0 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  if..    /* The a
26cc0 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64  ttempt to extend
26cd0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
26ce0 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72  pping failed. Fr
26cf0 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ee it. */.    if
26d00 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
26d10 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b  ED || pNew==0 ){
26d20 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
26d30 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a  pOrig, nReuse);.
26d40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
26d50 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c  If pNew is still
26d60 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72   NULL, try to cr
26d70 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79  eate an entirely
26d80 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f   new mapping. */
26d90 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
26da0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  {.    pNew = osM
26db0 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61  map(0, nNew, fla
26dc0 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
26dd0 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  h, 0);.  }..  if
26de0 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
26df0 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  ED ){.    pNew =
26e00 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30   0;.    nNew = 0
26e10 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  ;.    unixLogErr
26e20 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45  or(SQLITE_OK, zE
26e30 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  rr, pFd->zPath);
26e40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
26e50 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61 69  mmap() above fai
26e60 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  led, assume that
26e70 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
26e80 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20  mmap() calls.   
26e90 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c   ** will probabl
26ea0 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c  y fail too. Fall
26eb0 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78   back to using x
26ec0 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c  Read/xWrite excl
26ed0 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69  usively.    ** i
26ee0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
26ef0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
26f00 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  zeMax = 0;.  }. 
26f10 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
26f20 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b   = (void *)pNew;
26f30 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  .  pFd->mmapSize
26f40 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
26f50 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d  Actual = nNew;.}
26f60 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
26f70 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
26f80 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
26f90 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
26fa0 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
26fb0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
26fc0 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
26fd0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
26fe0 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
26ff0 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
27000 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
27010 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
27020 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
27030 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
27040 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
27050 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
27060 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
27070 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
27080 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
27090 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
270a0 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
270b0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
270c0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
270d0 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
270e0 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
270f0 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
27100 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
27110 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
27120 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
27130 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
27140 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
27150 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
27160 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
27170 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
27180 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
27190 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
271a0 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
271b0 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
271c0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54  FCNTL_MMAP_LIMIT
271d0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
271e0 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
271f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27200 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
27210 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
27220 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
27230 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
27240 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
27250 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
27260 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
27270 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
27280 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
27290 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
272a0 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
272b0 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
272c0 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e  {.  i64 nMap = n
272d0 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
272e0 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
272f0 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
27300 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
27310 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
27320 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
27330 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  E_OK;..  if( nMa
27340 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  p<0 ){.    struc
27350 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
27360 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
27370 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
27380 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63  mation */.    rc
27390 20 3d 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e   = osFstat(pFd->
273a0 68 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  h, &statbuf);.  
273b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
273c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
273d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
273e0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
273f0 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66    nMap = statbuf
27400 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20  .st_size;.  }.  
27410 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
27420 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
27430 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
27440 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20  pSizeMax;.  }.. 
27450 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
27460 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
27470 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20  if( nMap>0 ){.  
27480 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
27490 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
274a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
274b0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
274c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
274d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
274e0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
274f0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27500 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
27510 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
27520 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
27530 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
27540 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
27550 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
27560 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
27570 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
27580 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
27590 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
275a0 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
275b0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
275c0 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
275d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
275e0 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
275f0 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
27600 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
27610 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
27620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
27630 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
27640 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
27650 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
27660 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
27670 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
27680 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
27690 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
276a0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
276b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
276c0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
276d0 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
276e0 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
276f0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
27700 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
27710 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
27720 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
27730 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
27740 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
27750 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
27760 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
27770 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27780 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
27790 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
277a0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
277b0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
277c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
277d0 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
277e0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
277f0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
27800 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
27810 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
27820 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
27830 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
27840 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
27850 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
27860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27870 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
27880 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27890 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
278a0 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
278b0 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
278c0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
278d0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
278e0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
278f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
27900 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
27910 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
27920 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
27930 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
27940 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
27950 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
27960 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
27970 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
27980 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
27990 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
279a0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
279b0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
279c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
279d0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
279e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
279f0 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
27a00 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
27a10 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
27a20 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
27a30 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
27a40 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
27a50 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
27a60 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
27a70 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
27a80 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
27a90 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
27aa0 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
27ab0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
27ac0 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
27ad0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
27ae0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
27af0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
27b00 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
27b10 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
27b20 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
27b30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
27b40 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
27b50 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
27b60 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
27b70 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
27b80 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
27b90 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
27ba0 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
27bb0 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
27bc0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
27bd0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
27be0 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
27bf0 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
27c00 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
27c10 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
27c20 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
27c30 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
27c40 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
27c50 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
27c60 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
27c70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
27c80 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
27c90 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
27ca0 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
27cb0 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
27cc0 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
27cd0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
27ce0 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
27cf0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
27d00 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
27d10 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
27d20 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
27d30 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
27d40 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
27d50 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
27d60 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
27d70 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
27d80 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
27d90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
27da0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27db0 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
27dc0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
27dd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
27de0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
27df0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
27e00 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
27e10 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 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 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
27e40 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
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 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
27ec0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
27ed0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
27ee0 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
27ef0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
27f00 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
27f10 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
27f20 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
27f30 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
27f40 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
27f50 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
27f60 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
27f70 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
27f80 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
27f90 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
27fa0 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
27fb0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
27fc0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
27fd0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
27fe0 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
27ff0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
28000 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
28010 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
28020 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
28030 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
28040 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
28050 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
28060 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
28070 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
28080 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
28090 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
280a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
280b0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
280c0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
280d0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
280e0 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
280f0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
28100 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
28110 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
28120 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
28130 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
28140 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
28150 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
28160 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
28170 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
28180 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
28190 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
281a0 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
281b0 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
281c0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
281d0 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
281e0 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
281f0 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
28200 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
28210 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
28220 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
28230 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
28240 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
28250 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
28260 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
28270 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
28280 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
28290 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
282a0 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
282b0 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
282c0 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
282d0 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
282e0 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
282f0 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
28300 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
28310 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
28320 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
28330 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
28340 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
28350 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28360 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
28370 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
28380 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
28390 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
283a0 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
283b0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
283c0 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
283d0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
283e0 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
283f0 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
28400 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
28410 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
28420 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
28430 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
28440 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
28450 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45  NDER, METHOD, VE
28460 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f  RSION, CLOSE, LO
28470 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
28480 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69  CK)      \.stati
28490 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
284a0 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
284b0 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52          \.   VER
284e0 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20  SION,           
284f0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
28500 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
28530 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
28540 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
28550 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
28580 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
28590 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
285a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
285d0 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
285e0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
285f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
28620 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
28630 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
28640 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
28670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28680 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
286c0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
286d0 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
286e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
287a0 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
287d0 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
287f0 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
28800 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
28810 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
28820 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28840 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
28850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28860 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28890 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
288a0 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
288b0 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
288c0 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
288d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
288e0 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20  unixShmMap,     
288f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28900 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20  ShmMap */       
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28930 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  nixShmLock,     
28940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28950 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  hmLock */       
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28980 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ixShmBarrier,   
28990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
289a0 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20  mBarrier */     
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
289d0 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  xShmUnmap,      
289e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
289f0 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  Unmap */        
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28a20 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
28a30 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
28a40 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55        \.   unixU
28a70 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nfetch,         
28a80 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74         /* xUnfet
28a90 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 20 5c 0a 7d 3b 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
28b10 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28b20 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49  thods *FINDER##I
28b30 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mpl(const char *
28b40 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b  z, unixFile *p){
28b50 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41     \.  UNUSED_PA
28b60 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53  RAMETER(z); UNUS
28b70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45    \.  return &ME
28bb0 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20  THOD;           
28bc0 20 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 5c 0a 7d 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 20 20 20                  
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
28c50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28c60 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45  s *(*const FINDE
28c70 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  R)(const char*,u
28c80 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c  nixFile *p)    \
28c90 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49  .    = FINDER##I
28ca0 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  mpl;../*.** Here
28cb0 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20   are all of the 
28cc0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28cd0 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  ds objects for e
28ce0 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ach of the.** lo
28cf0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
28d00 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61  .  Functions tha
28d10 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  t return pointer
28d20 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f  s to these metho
28d30 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63  ds.** are also c
28d40 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54  reated..*/.IOMET
28d50 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46  HODS(.  posixIoF
28d60 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
28d70 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
28d80 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
28d90 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20  osixIoMethods,  
28da0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
28db0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28dc0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
28dd0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
28de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
28df0 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d  red memory and m
28e00 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20  map are enabled 
28e10 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e30 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
28e40 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e60 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
28e70 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20  /.  unixUnlock, 
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e90 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
28ea0 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
28eb0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f  servedLock     /
28ec0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28ed0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
28ee0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
28ef0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
28f00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
28f10 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
28f20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
28f30 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
28f40 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
28f50 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
28f60 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
28f90 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
28fa0 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28fc0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28fd0 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28ff0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29000 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
29010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29020 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29030 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
29040 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78  ervedLock   /* x
29050 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29060 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
29070 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f  METHODS(.  dotlo
29080 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
29090 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
290a0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
290b0 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f    dotlockIoMetho
290c0 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ds,         /* s
290d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
290e0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
290f0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29110 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29120 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64   disabled */.  d
29130 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
29140 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29150 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
29160 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
29170 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29180 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
29190 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
291a0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
291b0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
291c0 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
291d0 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65  vedLock  /* xChe
291e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
291f0 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
29200 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29210 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
29220 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
29230 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
29240 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29250 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29260 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
29270 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
29280 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29290 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
292a0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
292b0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
292c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
292d0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
292e0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63  sabled */.  floc
292f0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
29300 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29310 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29320 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
29330 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29340 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
29350 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29360 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29370 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29380 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
29390 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
293a0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
293b0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
293c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
293d0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
293e0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
293f0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29400 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29410 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29430 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29440 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
29450 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
29460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29470 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29480 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29490 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  semClose,       
294a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
294b0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
294c0 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  semLock,        
294d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
294e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
294f0 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  emUnlock,       
29500 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29510 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29520 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
29530 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
29540 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29550 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
29560 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
29570 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
29580 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29590 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
295a0 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
295b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
295c0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
295d0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
295e0 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
295f0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29600 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29610 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29630 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29640 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29650 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
29660 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29670 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29680 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
29690 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
296a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
296b0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
296c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
296d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
296e0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
296f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29700 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29710 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29720 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
29730 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c  *.** The proxy l
29740 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73  ocking method is
29750 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64   a "super-method
29760 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  " in the sense t
29770 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20  hat it.** opens 
29780 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64  secondary file d
29790 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74  escriptors for t
297a0 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63  he conch and loc
297b0 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69  k files and.** i
297c0 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f  t uses proxy, do
297d0 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64  t-file, AFP, and
297e0 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
297f0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73   methods on thos
29800 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66  e.** secondary f
29810 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20  iles.  For this 
29820 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
29830 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
29840 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f  ents.** proxy lo
29850 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64  cking is located
29860 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f   much further do
29870 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  wn in the file. 
29880 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20   But we need.** 
29890 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
298a0 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74  define the sqlit
298b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e  e3_io_methods an
298c0 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
298d0 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c  n.** for proxy l
298e0 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f  ocking here.  So
298f0 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c   we forward decl
29900 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  are the I/O meth
29910 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ods..*/.#if defi
29920 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29930 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29940 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
29950 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c  atic int proxyCl
29960 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
29970 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  *);.static int p
29980 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
29990 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
299a0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
299b0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
299c0 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
299d0 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
299e0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
299f0 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29  te3_file*, int*)
29a00 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  ;.IOMETHODS(.  p
29a10 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20  roxyIoFinder,   
29a20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29a30 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29a40 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74   */.  proxyIoMet
29a50 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
29a60 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
29a70 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
29a80 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29ab0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29ac0 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20  .  proxyClose,  
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ae0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29af0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20  .  proxyLock,   
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b10 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29b20 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20    proxyUnlock,  
29b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29b40 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29b50 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  .  proxyCheckRes
29b60 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20  ervedLock    /* 
29b70 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29b80 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
29b90 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f  endif../* nfs lo
29ba0 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b  ckd on OSX 10.3+
29bb0 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77   doesn't clear w
29bc0 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20  rite locks when 
29bd0 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
29be0 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  et */.#if define
29bf0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29c00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29c10 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29c20 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69  THODS(.  nfsIoFi
29c30 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29c40 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29c50 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29c60 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20   nfsIoMethods,  
29c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29c80 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29c90 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29ca0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29cc0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29cd0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29ce0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
29cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29d00 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29d10 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
29d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29d30 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29d40 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
29d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29d60 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29d70 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
29d80 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
29d90 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29da0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
29db0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
29dc0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29dd0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29de0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
29df0 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
29e00 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
29e10 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
29e20 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
29e30 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
29e40 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
29e50 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
29e60 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
29e70 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
29e80 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
29e90 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
29ea0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
29eb0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
29ec0 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
29ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
29ee0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
29ef0 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
29f00 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
29f10 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
29f20 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
29f30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
29f40 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
29f50 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
29f60 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
29f70 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
29f80 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
29f90 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
29fa0 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
29fb0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
29fc0 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29fe0 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
29ff0 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
2a000 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a010 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
2a020 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
2a030 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
2a040 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
2a050 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
2a060 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2a070 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
2a080 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
2a090 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
2a0a0 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
2a0b0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
2a0c0 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
2a0d0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2a0e0 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
2a0f0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a100 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
2a110 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2a120 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2a130 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2a140 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
2a150 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
2a160 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
2a170 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
2a180 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2a190 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
2a1a0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
2a1b0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2a1c0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
2a1d0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
2a1e0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2a1f0 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
2a200 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
2a210 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
2a220 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
2a230 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
2a240 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2a250 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2a260 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2a270 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
2a280 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
2a290 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2a2a0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2a2b0 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
2a2c0 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
2a2d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2a2e0 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
2a2f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a300 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
2a310 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
2a320 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
2a330 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
2a340 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2a350 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
2a360 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
2a370 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
2a380 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
2a390 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
2a3a0 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
2a3b0 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
2a3c0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2a3d0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2a3e0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2a3f0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2a400 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2a410 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2a420 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2a430 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2a440 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2a450 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20  =-1 ) {.    if( 
2a460 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2a470 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
2a480 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ")==0 ){.      r
2a490 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68  eturn &nfsIoMeth
2a4a0 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ods;.    } else 
2a4b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2a4c0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2a4d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2a4e0 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
2a4f0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2a500 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
2a510 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a520 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
2a530 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
2a540 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2a550 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
2a560 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
2a570 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
2a580 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2a590 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2a5a0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
2a5b0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20  .#if OS_VXWORKS 
2a5c0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2a5d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
2a5e0 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
2a5f0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
2a600 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
2a610 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
2a620 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
2a630 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2a640 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
2a650 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
2a660 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
2a670 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
2a680 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
2a690 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
2a6a0 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
2a6b0 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e  s for VXWorks on
2a6c0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
2a6d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a6e0 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
2a6f0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2a700 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2a710 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2a720 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a730 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2a740 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2a750 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
2a760 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
2a770 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
2a780 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2a790 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2a7a0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2a7b0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2a7c0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2a7d0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2a7e0 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2a7f0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2a800 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2a810 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2a820 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2a830 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
2a840 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
2a850 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
2a860 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
2a870 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2a880 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2a890 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
2a8a0 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
2a8b0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2a8c0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2a8d0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2a8e0 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2a8f0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2a900 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2a910 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2a920 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2a930 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2a940 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2a950 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2a960 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2a970 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
2a980 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
2a990 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2a9a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a9b0 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
2a9c0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
2a9d0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2a9e0 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
2a9f0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
2aa00 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
2aa10 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
2aa20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2aa30 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  YLE */../*.** An
2aa40 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66   abstract type f
2aa50 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
2aa60 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  a IO method find
2aa70 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
2aa80 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
2aa90 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2aaa0 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
2aab0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2aac0 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
2aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab10 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab30 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
2ab40 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
2ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab60 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
2ab70 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
2ab80 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
2ab90 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
2aba0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
2abb0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
2abc0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2abd0 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
2abe0 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
2abf0 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
2ac00 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
2ac10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2ac20 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
2ac30 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ac40 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2ac50 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2ac60 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ac80 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
2ac90 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
2aca0 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  ng opened */.  s
2acb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
2acc0 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
2acd0 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
2ace0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2acf0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2ad00 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
2ad10 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
2ad20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2ad30 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2ad40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
2ad50 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49  o or more UNIXFI
2ad60 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29  LE_* values */.)
2ad70 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
2ad80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
2ad90 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
2ada0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
2adb0 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
2adc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2add0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2ade0 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
2adf0 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73  NULL );..  /* Us
2ae00 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
2ae10 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
2ae20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
2ae30 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
2ae40 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
2ae50 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
2ae60 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
2ae70 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
2ae80 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
2ae90 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
2aea0 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
2aeb0 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
2aec0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2aed0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2aee0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2aef0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2af00 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
2af10 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
2af20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
2af30 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
2af40 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
2af50 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
2af60 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
2af70 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
2af80 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
2af90 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
2afa0 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
2afb0 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
2afc0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2afd0 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20  || (ctrlFlags & 
2afe0 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29  UNIXFILE_NOLOCK)
2aff0 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  !=0 );..  OSTRAC
2b000 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
2b010 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
2b020 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
2b030 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70  h = h;.  pNew->p
2b040 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e  Vfs = pVfs;.  pN
2b050 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
2b060 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63  ename;.  pNew->c
2b070 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63  trlFlags = (u8)c
2b080 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51  trlFlags;.#if SQ
2b090 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2b0a0 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61  ZE>0.  pNew->mma
2b0b0 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
2b0c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2b0d0 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20  zMmap;.#endif.  
2b0e0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
2b0f0 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c  boolean(((ctrlFl
2b100 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55  ags & UNIXFILE_U
2b110 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20  RI) ? zFilename 
2b120 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  : 0),.          
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
2b150 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2b160 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  ITE) ){.    pNew
2b170 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2b180 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  NIXFILE_PSOW;.  
2b190 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70  }.  if( strcmp(p
2b1a0 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
2b1b0 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -excl")==0 ){.  
2b1c0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2b1d0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  s |= UNIXFILE_EX
2b1e0 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  CL;.  }..#if OS_
2b1f0 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
2b200 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
2b210 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
2b220 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
2b230 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74  pId==0 ){.    ct
2b240 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2b250 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20  ILE_NOLOCK;.    
2b260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2b270 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
2b280 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26   if( ctrlFlags &
2b290 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2b2a0 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
2b2b0 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
2b2c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2b2d0 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
2b2e0 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
2b2f0 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
2b300 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
2b310 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
2b320 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b330 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
2b340 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
2b350 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2b360 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
2b370 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
2b380 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
2b390 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
2b3a0 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
2b3b0 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
2b3c0 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
2b3d0 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
2b3e0 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
2b3f0 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
2b400 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
2b410 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
2b420 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2b430 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
2b440 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
2b450 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2b460 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
2b470 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
2b480 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2b490 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2b4a0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
2b4b0 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
2b4c0 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
2b4d0 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
2b4e0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2b4f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
2b500 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2b510 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2b520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2b540 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2b550 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e  curred in findIn
2b560 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65  odeInfo(), close
2b570 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2b580 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d  ptor.      ** im
2b590 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72  mediately, befor
2b5a0 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  e releasing the 
2b5b0 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65  mutex. findInode
2b5c0 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a  Info() may fail.
2b5d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20        ** in two 
2b5e0 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20  scenarios:.     
2b5f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28   **.      **   (
2b600 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74  a) A call to fst
2b610 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20  at() failed..   
2b620 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61     **   (b) A ma
2b630 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20  lloc failed..   
2b640 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53     **.      ** S
2b650 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20  cenario (b) may 
2b660 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68  only occur if th
2b670 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  e process is hol
2b680 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20  ding no other.  
2b690 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63      ** file desc
2b6a0 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  riptors open on 
2b6b0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49  the same file. I
2b6c0 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68  f there were oth
2b6d0 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  er file.      **
2b6e0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20   descriptors on 
2b6f0 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20  this file, then 
2b700 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20  no malloc would 
2b710 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  be required by. 
2b720 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64       ** findInod
2b730 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73  eInfo(). If this
2b740 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
2b750 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74   is quite safe t
2b760 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a  o close.      **
2b770 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69   handle h - as i
2b780 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
2b790 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f  that no posix lo
2b7a0 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65  cks will be rele
2b7b0 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ased.      ** by
2b7c0 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20   doing so..     
2b7d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2b7e0 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75  scenario (a) cau
2b7f0 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68  sed the error th
2b800 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f  en things are no
2b810 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20  t so safe. The. 
2b820 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74       ** implicit
2b830 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65   assumption here
2b840 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61   is that if fsta
2b850 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67  t() fails, thing
2b860 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a  s are in.      *
2b870 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65  * such bad shape
2b880 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61   that dropping a
2b890 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65   lock or two doe
2b8a0 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68  sn't matter much
2b8b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b8c0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2b8d0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2b8e0 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a  ;.      h = -1;.
2b8f0 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2b900 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2b910 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2b920 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2b930 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
2b940 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  PLE__).  else if
2b950 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2b960 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
2b970 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
2b980 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2b990 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2b9a0 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2b9b0 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2b9c0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
2b9d0 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
2b9e0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2b9f0 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
2ba00 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2ba10 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
2ba20 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
2ba30 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
2ba40 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
2ba50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ba60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
2ba70 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
2ba80 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
2ba90 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
2baa0 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
2bab0 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
2bac0 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
2bad0 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
2bae0 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
2baf0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
2bb00 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
2bb10 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
2bb20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
2bb30 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
2bb40 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
2bb50 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
2bb60 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
2bb70 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
2bb80 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2bb90 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2bba0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2bbb0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  ->pInode);.     
2bbc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bbd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
2bbe0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2bbf0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2bc00 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
2bc10 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2bc20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2bc30 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
2bc40 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
2bc50 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
2bc60 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
2bc70 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
2bc80 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2bc90 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2bca0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
2bcb0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
2bcc0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
2bcd0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
2bce0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
2bcf0 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
2bd00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
2bd10 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
2bd20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
2bd30 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
2bd40 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
2bd50 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e  name!=0 );.    n
2bd60 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29  Filename = (int)
2bd70 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
2bd80 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b  ) + 6;.    zLock
2bd90 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
2bda0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46  qlite3_malloc(nF
2bdb0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
2bdc0 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29  ( zLockFile==0 )
2bdd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2bde0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2bdf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2be00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
2be10 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c  lename, zLockFil
2be20 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f  e, "%s" DOTLOCK_
2be30 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d  SUFFIX, zFilenam
2be40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  e);.    }.    pN
2be50 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2be60 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  xt = zLockFile;.
2be70 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
2be80 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70  RKS.  else if( p
2be90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2bea0 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &semIoMethods ){
2beb0 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65  .    /* Named se
2bec0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
2bed0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2bee0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2bef0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c  o be.    ** incl
2bf00 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c  uded in the semL
2bf10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20  ockingContext.  
2bf20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74    */.    unixEnt
2bf30 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2bf40 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2bf50 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2bf60 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2bf70 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
2bf80 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  && (pNew->pInode
2bf90 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b  ->pSem==NULL) ){
2bfa0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65  .      char *zSe
2bfb0 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49  mName = pNew->pI
2bfc0 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a  node->aSemName;.
2bfd0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2bfe0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2bff0 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
2c000 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73  , zSemName, "/%s
2c010 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  .sem",.         
2c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
2c030 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  ew->pId->zCanoni
2c040 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  calName);.      
2c050 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61  for( n=1; zSemNa
2c060 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20  me[n]; n++ ).   
2c070 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d       if( zSemNam
2c080 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d  e[n]=='/' ) zSem
2c090 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20  Name[n] = '_';. 
2c0a0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
2c0b0 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70  e->pSem = sem_op
2c0c0 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43  en(zSemName, O_C
2c0d0 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a  REAT, 0666, 1);.
2c0e0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
2c0f0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20  pInode->pSem == 
2c100 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  SEM_FAILED ){.  
2c110 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c120 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2c130 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2c140 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
2c150 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
2c160 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2c170 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2c180 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73  f.  .  pNew->las
2c190 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20  tErrno = 0;.#if 
2c1a0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
2c1b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c1c0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2c1d0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2c1e0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2c1f0 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
2c200 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
2c210 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
2c220 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2c230 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2c240 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2c250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c260 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2c270 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2c280 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2c290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
2c2a0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
2c2b0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
2c2c0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
2c2d0 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
2c2e0 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
2c2f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c300 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2c310 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
2c320 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
2c330 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
2c340 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
2c350 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
2c360 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
2c370 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
2c380 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2c390 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2c3a0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2c3b0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2c3c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
2c3d0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
2c3e0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
2c3f0 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
2c400 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
2c410 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
2c420 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
2c430 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
2c440 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67   */.  };.  unsig
2c450 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ned int i;.  str
2c460 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2c470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2c480 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b   = 0;..  azDirs[
2c490 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
2c4a0 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
2c4b0 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
2c4c0 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
2c4d0 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
2c4e0 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  R");.  if( !azDi
2c4f0 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32  rs[2] ) azDirs[2
2c500 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
2c510 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  IR");.  for(i=0;
2c520 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
2c530 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
2c540 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
2c550 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20  [i++]){.    if( 
2c560 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
2c570 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74  ue;.    if( osSt
2c580 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29  at(zDir, &buf) )
2c590 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c5a0 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
2c5b0 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
2c5c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41  nue;.    if( osA
2c5d0 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20  ccess(zDir, 07) 
2c5e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c5f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2c600 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zDir;.}../*.
2c610 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
2c620 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
2c630 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
2c640 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
2c650 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
2c660 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
2c670 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
2c680 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
2c690 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
2c6a0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
2c6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2c6c0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
2c6d0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2c6e0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2c6f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2c700 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
2c710 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
2c720 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
2c730 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
2c740 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
2c750 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
2c760 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
2c770 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
2c780 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74   *zDir;..  /* It
2c790 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
2c7a0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
2c7b0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
2c7c0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
2c7d0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
2c7e0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
2c7f0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
2c800 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
2c810 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
2c820 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
2c830 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
2c840 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2c850 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
2c860 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
2c870 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
2c880 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20  Dir==0 ) zDir = 
2c890 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ".";..  /* Check
2c8a0 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
2c8b0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
2c8c0 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
2c8d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
2c8e0 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
2c8f0 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
2c900 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
2c910 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e  */.  if( (strlen
2c920 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28  (zDir) + strlen(
2c930 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2c940 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e  _PREFIX) + 18) >
2c950 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
2c960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c970 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2c980 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
2c990 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
2c9a0 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  18, zBuf, "%s/"S
2c9b0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
2c9c0 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
2c9d0 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
2c9e0 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
2c9f0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
2ca00 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
2ca10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
2ca20 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
2ca30 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
2ca40 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
2ca50 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
2ca60 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
2ca70 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
2ca80 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
2ca90 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20  ;.    zBuf[j+1] 
2caa0 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  = 0;.  }while( o
2cab0 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
2cac0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2cad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2cae0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2caf0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2cb00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2cb10 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
2cb20 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2cb30 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
2cb40 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
2cb50 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
2cb60 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
2cb70 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
2cb80 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
2cb90 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
2cba0 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
2cbb0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
2cbc0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
2cbd0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
2cbe0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2cbf0 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
2cc00 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
2cc10 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2cc20 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2cc30 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
2cc40 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
2cc50 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2cc60 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
2cc70 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
2cc80 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
2cc90 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
2cca0 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
2ccb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
2ccc0 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
2ccd0 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
2cce0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
2ccf0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2cd00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
2cd10 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
2cd20 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
2cd30 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
2cd40 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
2cd50 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
2cd60 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
2cd70 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
2cd80 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
2cd90 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
2cda0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
2cdb0 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
2cdc0 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
2cdd0 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
2cde0 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
2cdf0 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
2ce00 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
2ce10 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
2ce20 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
2ce30 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
2ce40 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
2ce50 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
2ce60 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
2ce70 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
2ce80 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
2ce90 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
2cea0 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
2ceb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2cec0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
2ced0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
2cee0 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
2cef0 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
2cf00 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
2cf10 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2cf20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
2cf30 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
2cf40 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2cf50 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
2cf60 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2cf70 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
2cf80 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
2cf90 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2cfa0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
2cfb0 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
2cfc0 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
2cfd0 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
2cfe0 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
2cff0 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
2d000 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
2d010 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
2d020 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
2d030 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
2d040 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
2d050 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
2d060 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
2d070 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
2d080 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
2d090 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
2d0a0 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
2d0b0 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
2d0c0 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
2d0d0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
2d0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d0f0 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
2d100 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
2d110 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
2d120 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
2d130 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
2d140 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
2d150 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
2d160 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
2d170 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
2d180 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
2d190 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
2d1a0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2d1b0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2d1c0 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
2d1d0 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
2d1e0 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
2d1f0 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
2d200 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
2d210 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
2d220 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
2d230 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
2d240 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
2d250 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
2d260 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
2d270 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
2d280 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
2d290 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
2d2a0 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
2d2b0 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
2d2c0 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
2d2d0 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65   for a resusable
2d2e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2d2f0 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
2d300 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  */.  if( 0==osSt
2d310 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
2d320 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
2d330 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
2d340 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2d350 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64  tex();.    pInod
2d360 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
2d370 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65     while( pInode
2d380 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c   && (pInode->fil
2d390 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73  eId.dev!=sStat.s
2d3a0 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20  t_dev.          
2d3b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49             || pI
2d3c0 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
2d3d0 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20  !=sStat.st_ino) 
2d3e0 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ){.       pInode
2d3f0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
2d400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d410 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  pInode ){.      
2d420 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70  UnixUnusedFd **p
2d430 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
2d440 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
2d450 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
2d460 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
2d470 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
2d480 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
2d490 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
2d4a0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2d4b0 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
2d4c0 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
2d4d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
2d4e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2d4f0 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20   }.#endif    /* 
2d500 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a  if !OS_VXWORKS *
2d510 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73  /.  return pUnus
2d520 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
2d530 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2d540 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
2d550 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
2d560 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
2d570 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
2d580 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
2d590 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
2d5a0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2d5b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2d5c0 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
2d5d0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
2d5e0 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
2d5f0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
2d600 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
2d610 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
2d620 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2d630 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
2d640 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
2d650 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
2d660 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
2d670 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
2d680 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73  ed..**.** In mos
2d690 74 20 63 61 73 65 73 20 63 61 73 65 73 2c 20 74  t cases cases, t
2d6a0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
2d6b0 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68   *pMode to 0, wh
2d6c0 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a  ich will become.
2d6d0 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  ** an indication
2d6e0 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28   to robust_open(
2d6f0 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  ) to create the 
2d700 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51  file using.** SQ
2d710 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2d720 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64  E_PERMISSIONS ad
2d730 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d  justed by the um
2d740 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  ask..** But if t
2d750 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2d760 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
2d770 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
2d780 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
2d790 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
2d7a0 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
2d7b0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
2d7c0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
2d7d0 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
2d7e0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
2d7f0 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
2d800 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
2d810 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
2d820 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
2d830 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
2d840 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
2d850 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
2d860 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
2d870 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2d880 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
2d890 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
2d8a0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
2d8b0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
2d8c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
2d8d0 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
2d8e0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
2d8f0 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
2d900 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
2d910 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
2d920 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
2d930 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
2d940 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
2d950 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
2d960 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
2d970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
2d980 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
2d990 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d9a0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2d9b0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
2d9c0 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
2d9d0 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
2d9e0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da00 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
2da10 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
2da20 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
2da30 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
2da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da50 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
2da60 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
2da70 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
2da80 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
2da90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2daa0 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f  UT: uid to set o
2dab0 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2dac0 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20  gid_t *pGid     
2dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dae0 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73  /* OUT: gid to s
2daf0 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
2db00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2db10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2db20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2db30 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64   Code */.  *pMod
2db40 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d  e = 0;.  *pUid =
2db50 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b   0;.  *pGid = 0;
2db60 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  .  if( flags & (
2db70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2db80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2db90 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2dba0 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41   char zDb[MAX_PA
2dbb0 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f  THNAME+1];     /
2dbc0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
2dbd0 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
2dbe0 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  nDb;            
2dbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2dc00 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74  ber of valid byt
2dc10 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20  es in zDb */.   
2dc20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2dc30 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  at;            /
2dc40 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74  * Output of stat
2dc50 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  () on database f
2dc60 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a  ile */..    /* z
2dc70 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74  Path is a path t
2dc80 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e  o a WAL or journ
2dc90 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c  al file. The fol
2dca0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72  lowing block der
2dcb0 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ives.    ** the 
2dcc0 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f  path to the asso
2dcd0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
2dce0 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e  file from zPath.
2dcf0 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
2dd00 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  les.    ** the f
2dd10 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20  ollowing naming 
2dd20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20  conventions:.   
2dd30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70   **.    **   "<p
2dd40 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
2dd50 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
2dd60 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a  ath to db>-wal".
2dd70 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2dd80 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e  to db>-journalNN
2dd90 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2dda0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a  h to db>-walNN".
2ddb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68      **.    ** wh
2ddc0 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69  ere NN is a deci
2ddd0 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20  mal number. The 
2dde0 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
2ddf0 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
2de00 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
2de10 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
2de20 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
2de30 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
2de40 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
2de50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2de60 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a  NABLE_8_3_NAMES.
2de70 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30      while( nDb>0
2de80 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e   && sqlite3Isaln
2de90 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29  um(zPath[nDb]) )
2dea0 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20   nDb--;.    if( 
2deb0 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  nDb==0 || zPath[
2dec0 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75  nDb]!='-' ) retu
2ded0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
2dee0 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  lse.    while( z
2def0 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29  Path[nDb]!='-' )
2df00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2df10 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  nDb>0 );.      a
2df20 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62  ssert( zPath[nDb
2df30 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20  ]!='\n' );.     
2df40 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65   nDb--;.    }.#e
2df50 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28  ndif.    memcpy(
2df60 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
2df70 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
2df80 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
2df90 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26  0==osStat(zDb, &
2dfa0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2dfb0 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
2dfc0 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
2dfd0 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74       *pUid = sSt
2dfe0 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20  at.st_uid;.     
2dff0 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73   *pGid = sStat.s
2e000 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65  t_gid;.    }else
2e010 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2e020 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
2e030 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2e040 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
2e050 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2e060 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f  LOSE ){.    *pMo
2e070 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20  de = 0600;.  }. 
2e080 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e090 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
2e0a0 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a  le zPath..** .**
2e0b0 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65   Previously, the
2e0c0 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72   SQLite OS layer
2e0d0 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63   used three func
2e0e0 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f  tions in place o
2e0f0 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a  f this.** one:.*
2e100 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
2e110 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
2e120 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2e130 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
2e140 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  );.**     sqlite
2e150 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
2e160 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ();.**.** These 
2e170 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64  calls correspond
2e180 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2e190 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  g combinations o
2e1a0 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
2e1b0 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d     ReadWrite() -
2e1c0 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45  >     (READWRITE
2e1d0 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20   | CREATE).**   
2e1e0 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e    ReadOnly()  ->
2e1f0 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20       (READONLY) 
2e200 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c  .**     OpenExcl
2e210 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44  usive() -> (READ
2e220 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c  WRITE | CREATE |
2e230 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a   EXCLUSIVE).**.*
2e240 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78  * The old OpenEx
2e250 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74  clusive() accept
2e260 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67  ed a boolean arg
2e270 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67  ument - "delFlag
2e280 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74  ". If.** true, t
2e290 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66  he file was conf
2e2a0 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74  igured to be aut
2e2b0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
2e2c0 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66  ed when the.** f
2e2d0 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65  ile handle close
2e2e0 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68  d. To achieve th
2e2f0 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73  e same effect us
2e300 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a  ing this new .**
2e310 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20   interface, add 
2e320 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  the DELETEONCLOS
2e330 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20  E flag to those 
2e340 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20  specified above 
2e350 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c  for .** OpenExcl
2e360 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  usive()..*/.stat
2e370 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28  ic int unixOpen(
2e380 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2e390 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
2e3a0 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77  /* The VFS for w
2e3b0 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65  hich this is the
2e3c0 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f   xOpen method */
2e3d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2e3e0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2e3f0 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66  /* Pathname of f
2e400 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ile to be opened
2e410 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2e420 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
2e430 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
2e440 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
2e450 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69  filled in */.  i
2e460 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2e470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e480 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f  nput flags to co
2e490 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e  ntrol the openin
2e4a0 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  g */.  int *pOut
2e4b0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
2e4c0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c      /* Output fl
2e4d0 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ags returned to 
2e4e0 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29  SQLite core */.)
2e4f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20  {.  unixFile *p 
2e500 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46  = (unixFile *)pF
2e510 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20  ile;.  int fd = 
2e520 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
2e530 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2e540 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65  scriptor returne
2e550 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  d by open() */. 
2e560 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
2e570 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e580 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
2e590 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   to open() */.  
2e5a0 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
2e5b0 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
2e5c0 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
2e5d0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2e5e0 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  noLock;         
2e5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e600 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69  ue to omit locki
2e610 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f  ng primitives */
2e620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e630 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2e640 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
2e650 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
2e660 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30  nt ctrlFlags = 0
2e670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e680 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67   UNIXFILE_* flag
2e690 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78  s */..  int isEx
2e6a0 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
2e6b0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e6c0 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
2e6d0 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
2e6e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e6f0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2e700 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
2e710 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
2e720 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e730 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
2e740 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
2e750 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2e760 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2e770 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
2e780 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2e790 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2e7a0 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  E);.#if SQLITE_E
2e7b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2e7c0 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f  YLE.  int isAuto
2e7d0 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20  Proxy  = (flags 
2e7e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  & SQLITE_OPEN_AU
2e7f0 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66  TOPROXY);.#endif
2e800 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2e810 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2e820 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2e830 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20  _STYLE.  struct 
2e840 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23  statfs fsInfo;.#
2e850 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63  endif..  /* If c
2e860 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72  reating a master
2e870 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f   or main-file jo
2e880 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63  urnal, this func
2e890 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20  tion will open. 
2e8a0 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72   ** a file-descr
2e8b0 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72  iptor on the dir
2e8c0 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20  ectory too. The 
2e8d0 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53  first time unixS
2e8e0 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61  ync().  ** is ca
2e8f0 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f  lled the directo
2e900 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
2e910 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63  or will be fsync
2e920 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29  ()ed and close()
2e930 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79  d..  */.  int sy
2e940 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61 74  ncDir = (isCreat
2e950 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
2e960 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2e970 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2e980 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2e990 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2e9a0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
2e9b0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2e9c0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
2e9d0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
2e9e0 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
2e9f0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
2ea00 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
2ea10 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
2ea20 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
2ea30 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
2ea40 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
2ea50 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
2ea60 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
2ea70 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
2ea80 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  +2];.  const cha
2ea90 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68  r *zName = zPath
2eaa0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2eab0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
2eac0 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
2ead0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
2eae0 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
2eaf0 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
2eb00 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
2eb10 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
2eb20 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
2eb30 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
2eb40 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
2eb50 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2eb60 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
2eb70 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
2eb80 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
2eb90 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2eba0 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
2ebb0 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
2ebc0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2ebd0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2ebe0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
2ebf0 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
2ec00 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
2ec10 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
2ec20 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
2ec30 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
2ec40 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
2ec50 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
2ec60 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
2ec70 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
2ec80 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
2ec90 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
2eca0 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
2ecb0 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
2ecc0 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
2ecd0 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
2ece0 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
2ecf0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2ed00 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
2ed10 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
2ed20 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
2ed30 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2ed40 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2ed50 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2ed60 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
2ed70 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2ed80 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2ed90 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2eda0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2edb0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
2edc0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
2edd0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
2ede0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2edf0 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
2ee00 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2ee10 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2ee20 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2ee30 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
2ee40 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
2ee50 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
2ee60 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
2ee70 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
2ee80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
2ee90 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2eea0 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
2eeb0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2eec0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
2eed0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2eee0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2eef0 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
2ef00 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
2ef10 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
2ef20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2ef30 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2ef40 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
2ef50 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2ef60 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
2ef70 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2ef80 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
2ef90 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
2efa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
2efb0 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74   );..  /* Detect
2efc0 20 61 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e   a pid change an
2efd0 64 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47  d reset the PRNG
2efe0 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61  .  There is a ra
2eff0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a  ce condition.  *
2f000 2a 20 68 65 72 65 20 73 75 63 68 20 74 68 61 74  * here such that
2f010 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72   two or more thr
2f020 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20  eads all trying 
2f030 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
2f040 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61  s at.  ** the sa
2f050 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74  me instant might
2f060 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50   all reset the P
2f070 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70  RNG.  But multip
2f080 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61  le resets.  ** a
2f090 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  re harmless..  *
2f0a0 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65  /.  if( randomne
2f0b0 73 73 50 69 64 21 3d 67 65 74 70 69 64 28 29 20  ssPid!=getpid() 
2f0c0 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73  ){.    randomnes
2f0d0 73 50 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b  sPid = getpid();
2f0e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
2f0f0 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
2f100 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  }..  memset(p, 0
2f110 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
2f120 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
2f130 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2f140 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
2f150 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2f160 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
2f170 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
2f180 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
2f190 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
2f1a0 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
2f1b0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
2f1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
2f1d0 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
2f1e0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
2f1f0 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69  nused));.      i
2f200 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
2f210 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f220 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
2f240 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
2f250 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61  ed;..    /* Data
2f260 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
2f270 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
2f280 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
2f290 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a  y are not.    **
2f2a0 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
2f2b0 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
2f2c0 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
2f2d0 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
2f2e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
2f2f0 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
2f300 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c  .    assert( (fl
2f310 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f320 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b  N_URI) || zName[
2f330 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
2f340 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20  ==0 );..  }else 
2f350 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
2f360 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
2f370 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
2f380 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
2f390 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
2f3a0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2f3b0 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e  isDelete && !syn
2f3c0 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  cDir);.    rc = 
2f3d0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
2f3e0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20  MAX_PATHNAME+2, 
2f3f0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
2f400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f410 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f420 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
2f430 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
2f440 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2f450 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2f460 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  enames are alway
2f470 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  s double-zero te
2f480 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20  rminated.    ** 
2f490 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74  for use by sqlit
2f4a0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
2f4b0 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
2f4c0 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  t( zName[strlen(
2f4d0 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
2f4e0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
2f4f0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
2f500 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2f510 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
2f520 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
2f530 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
2f540 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
2f550 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
2f560 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2f570 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
2f580 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2f590 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
2f5a0 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
2f5b0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
2f5c0 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
2f5d0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
2f5e0 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
2f5f0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
2f600 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2f610 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
2f620 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
2f630 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
2f640 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
2f650 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
2f660 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
2f670 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
2f680 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
2f690 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
2f6a0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
2f6b0 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
2f6c0 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
2f6d0 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
2f6e0 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
2f6f0 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
2f700 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
2f710 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
2f720 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
2f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f740 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
2f750 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
2f760 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
2f770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
2f780 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
2f790 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
2f7a0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2f7b0 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
2f7c0 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
2f7d0 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
2f7e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f7f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2f800 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20  p->pUnused );.  
2f810 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2f820 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2f830 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
2f840 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2f850 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
2f860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2f870 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
2f880 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
2f890 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
2f8a0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
2f8b0 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
2f8c0 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
2f8d0 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
2f8e0 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
2f8f0 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
2f900 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
2f910 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
2f920 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
2f930 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
2f940 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2f950 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
2f960 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
2f970 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
2f980 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2f990 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2f9a0 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
2f9b0 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
2f9c0 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
2f9d0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
2f9e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
2f9f0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
2fa00 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2fa10 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
2fa20 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
2fa30 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2fa40 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2fa50 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
2fa60 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2fa70 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
2fa80 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2fa90 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
2faa0 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
2fab0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2fac0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
2fad0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
2fae0 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
2faf0 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
2fb00 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
2fb10 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
2fb20 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
2fb30 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
2fb40 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
2fb50 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
2fb60 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
2fb70 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
2fb80 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
2fb90 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
2fba0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2fbb0 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2fbc0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2fbd0 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66 64       osFchown(fd
2fbe0 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20  , uid, gid);.   
2fbf0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2fc00 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20   fd>=0 );.  if( 
2fc10 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
2fc20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
2fc30 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
2fc40 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  p->pUnused ){.  
2fc50 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64    p->pUnused->fd
2fc60 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55   = fd;.    p->pU
2fc70 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66  nused->flags = f
2fc80 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
2fc90 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
2fca0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2fcb0 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
2fcc0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
2fcd0 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
2fce0 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74  _CLOSE).    zPat
2fcf0 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  h = sqlite3_mpri
2fd00 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29  ntf("%s", zName)
2fd10 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d  ;.    if( zPath=
2fd20 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
2fd30 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2fd40 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2fd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2fd60 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  OMEM;.    }.#els
2fd70 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  e.    osUnlink(z
2fd80 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
2fd90 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
2fda0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2fdb0 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
2fdc0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
2fdd0 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
2fde0 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
2fdf0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2fe00 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
2fe10 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2fe20 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2fe30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2fe40 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
2fe50 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
2fe60 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75  == -1 ){.    ((u
2fe70 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
2fe80 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2fe90 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  no;.    robust_c
2fea0 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2feb0 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
2fec0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2fed0 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
2fee0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
2fef0 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
2ff00 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2ff10 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2ff20 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2ff30 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2ff40 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2ff50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
2ff60 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
2ff70 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
2ff80 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2ffa0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2ffb0 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
2ffc0 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2ffe0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2fff0 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28  LE_RDONLY;.  if(
30000 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20   noLock )       
30010 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
30020 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
30030 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73  _NOLOCK;.  if( s
30040 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20  yncDir )        
30050 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
30060 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
30070 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c  IRSYNC;.  if( fl
30080 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
30090 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67  N_URI ) ctrlFlag
300a0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52  s |= UNIXFILE_UR
300b0 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  I;..#if SQLITE_E
300c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
300d0 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
300e0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
300f0 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
30100 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
30110 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
30120 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
30130 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
30140 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
30150 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
30160 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
30170 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
30180 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
30190 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
301a0 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
301b0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
301c0 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
301d0 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
301e0 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
301f0 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
30200 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
30210 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
30220 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
30230 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
30240 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
30250 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
30260 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
30270 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
30280 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
30290 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
302a0 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
302b0 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
302c0 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
302d0 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
302e0 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
302f0 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
30300 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
30310 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
30320 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
30330 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
30340 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
30350 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
30360 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
30370 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
30380 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
30390 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
303a0 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
303b0 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
303c0 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
303d0 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
303e0 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
303f0 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
30400 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
30410 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
30420 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
30430 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
30440 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
30450 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
30460 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
30470 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
30480 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
30490 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
304a0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
304b0 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
304c0 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
304d0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
304e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
304f0 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
30500 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
30510 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
30520 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
30530 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
30540 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
30550 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
30560 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
30570 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
30580 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
30590 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
305a0 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
305b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
305c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
305d0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
305e0 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
305f0 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
30600 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30620 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
30630 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
30640 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
30650 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
30660 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
30670 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
30680 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
30690 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
306a0 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
306b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
306c0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
306d0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
306e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
306f0 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
30700 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
30710 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
30720 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
30730 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30750 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
30760 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
30770 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
30780 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
30790 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
307a0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
307b0 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69  Flags);..open_fi
307c0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
307d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
307e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
307f0 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d  p->pUnused);.  }
30800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30810 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
30820 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
30830 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
30840 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
30850 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
30860 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
30870 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
30880 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
30890 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
308a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
308b0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
308c0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
308d0 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
308e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
308f0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
30900 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
30910 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
30920 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
30930 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
30940 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
30950 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
30960 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
30970 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
30980 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30990 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
309a0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
309b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
309c0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
309d0 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
309e0 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
309f0 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  th)==(-1) ){.   
30a00 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45   if( errno==ENOE
30a10 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  NT.#if OS_VXWORK
30a20 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 65 72 72  S.        || err
30a30 6e 6f 3d 3d 30 78 33 38 30 30 30 33 0a 23 65 6e  no==0x380003.#en
30a40 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
30a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
30a60 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
30a70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30a80 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
30a90 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
30aa0 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
30ab0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
30ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30ad0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
30ae0 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
30af0 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
30b00 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
30b10 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
30b20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
30b30 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
30b40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30b50 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
30b60 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
30b70 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
30b80 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
30b90 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
30ba0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
30bb0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
30bc0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
30bd0 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
30be0 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
30bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
30c00 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
30c10 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
30c20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
30c30 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
30c40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30c50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
30c60 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
30c70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
30c80 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  st the existence
30c90 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
30ca0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
30cb0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
30cc0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
30cd0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
30ce0 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
30cf0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
30d00 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
30d10 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
30d20 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
30d30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
30d40 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
30d50 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
30d60 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
30d70 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
30d80 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
30d90 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
30da0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
30db0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
30dc0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
30dd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30de0 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
30df0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30e00 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
30e10 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
30e20 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
30e30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30e40 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
30e50 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
30e60 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
30e70 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
30e80 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
30e90 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
30ea0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
30eb0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
30ec0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
30ed0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
30ee0 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
30ef0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
30f00 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
30f10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30f20 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
30f30 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
30f40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
30f50 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
30f60 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
30f70 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30f80 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
30f90 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
30fa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30fb0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30fc0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
30fd0 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
30fe0 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
30ff0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
31000 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
31010 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
31020 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
31030 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
31040 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
31050 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
31060 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
31070 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
31080 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
31090 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
310a0 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
310b0 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
310c0 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
310d0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
310e0 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
310f0 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
31100 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
31110 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
31120 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
31130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31140 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
31150 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
31160 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
31170 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
31180 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
31190 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
311a0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
311b0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
311c0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
311d0 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
311e0 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
311f0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
31200 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
31210 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
31220 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
31230 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
31240 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
31250 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
31260 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
31270 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
31280 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
31290 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
312a0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
312b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
312c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
312d0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
312e0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
312f0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
31300 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
31310 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
31320 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
31330 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
31340 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
31350 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
31360 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
31370 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
31380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31390 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
313a0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
313b0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
313c0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
313d0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
313e0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
313f0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
31400 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
31410 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
31420 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
31430 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
31440 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
31450 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
31460 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
31470 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
31480 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
31490 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
314a0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
314b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
314c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
314d0 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
314e0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
314f0 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
31500 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
31510 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
31520 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
31530 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
31540 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
31550 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31560 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
31570 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
31580 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
31590 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
315a0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
315b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
315c0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
315d0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
315e0 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
315f0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31600 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
31610 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
31620 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31630 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
31640 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
31650 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
31660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31670 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
31680 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
31690 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
316a0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
316b0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
316c0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
316d0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
316e0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
316f0 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
31700 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
31710 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
31720 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
31730 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
31740 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
31750 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
31760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
31770 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
31780 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31790 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
317a0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
317b0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
317c0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
317d0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
317e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
317f0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
31800 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
31810 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
31820 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
31830 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
31840 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
31850 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
31860 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
31870 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
31880 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
31890 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
318a0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
318b0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
318c0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
318d0 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
318e0 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
318f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
31900 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
31910 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
31920 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31930 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
31940 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
31950 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
31960 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31970 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
31980 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
31990 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
319a0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
319b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
319c0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
319d0 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
319e0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
319f0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
31a00 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
31a10 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
31a20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
31a30 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
31a40 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
31a50 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
31a60 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
31a70 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
31a80 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
31a90 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
31aa0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
31ab0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
31ac0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
31ad0 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
31ae0 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
31af0 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
31b00 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
31b10 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31b20 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
31b30 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
31b40 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
31b50 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
31b60 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
31b70 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
31b80 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
31b90 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
31ba0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
31bb0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
31bc0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
31bd0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
31be0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
31bf0 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
31c00 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
31c10 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
31c20 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
31c30 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
31c40 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
31c50 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
31c60 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
31c70 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
31c80 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
31c90 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
31ca0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
31cb0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
31cc0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
31cd0 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
31ce0 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
31cf0 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
31d00 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
31d10 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
31d20 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
31d30 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
31d40 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
31d50 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
31d60 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
31d70 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
31d80 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
31d90 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
31da0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
31db0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
31dc0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
31dd0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31de0 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
31df0 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
31e00 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
31e10 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
31e20 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
31e30 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
31e40 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
31e50 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
31e60 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
31e70 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
31e80 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31e90 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
31ea0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
31eb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
31ec0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
31ed0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
31ee0 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
31ef0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31f00 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
31f10 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
31f20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31f30 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
31f40 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
31f50 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
31f60 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
31f70 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
31f80 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
31f90 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
31fa0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
31fb0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
31fc0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
31fd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31fe0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
31ff0 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
32000 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
32010 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
32020 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
32030 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
32040 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
32050 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
32060 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
32070 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
32080 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
32090 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
320a0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
320b0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
320c0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
320d0 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
320e0 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
320f0 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
32100 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
32110 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
32120 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
32130 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
32140 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
32150 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
32160 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
32170 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
32180 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
32190 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
321a0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
321b0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
321c0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
321d0 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
321e0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
321f0 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
32200 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
32210 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
32220 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
32230 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
32240 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
32250 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
32260 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
32270 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
32280 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
32290 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
322a0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
322b0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
322c0 20 67 65 74 70 69 64 28 29 3b 20 20 0a 23 69 66   getpid();  .#if
322d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
322e0 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
322f0 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20  nt fd, got;.    
32300 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
32310 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
32320 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20   O_RDONLY, 0);. 
32330 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
32340 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
32350 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
32360 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
32370 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
32380 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
32390 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
323a0 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 2c   &randomnessPid,
323b0 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65   sizeof(randomne
323c0 73 73 50 69 64 29 29 3b 0a 20 20 20 20 20 20 61  ssPid));.      a
323d0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
323e0 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65  +sizeof(randomne
323f0 73 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29  ssPid)<=(size_t)
32400 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42  nBuf );.      nB
32410 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b  uf = sizeof(t) +
32420 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65   sizeof(randomne
32430 73 73 50 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ssPid);.    }els
32440 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74  e{.      do{ got
32450 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42   = osRead(fd, zB
32460 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c  uf, nBuf); }whil
32470 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
32480 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
32490 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
324a0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
324b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
324c0 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  f.  return nBuf;
324d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
324e0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
324f0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
32500 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
32510 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
32520 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
32530 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
32540 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
32550 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
32560 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
32570 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
32580 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
32590 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
325a0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
325b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
325c0 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
325d0 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
325e0 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
325f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
32600 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
32610 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
32620 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
32630 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
32640 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
32650 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
32660 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
32670 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  s){.#if OS_VXWOR
32680 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
32690 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74  spec sp;..  sp.t
326a0 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63  v_sec = microsec
326b0 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a  onds / 1000000;.
326c0 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28    sp.tv_nsec = (
326d0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31  microseconds % 1
326e0 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a  000000) * 1000;.
326f0 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c    nanosleep(&sp,
32700 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44   NULL);.  UNUSED
32710 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32720 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
32730 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
32740 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
32750 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
32760 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
32770 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
32780 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32790 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
327a0 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
327b0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
327c0 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
327d0 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
327e0 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
327f0 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
32800 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32810 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  sed);.  return s
32820 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
32830 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
32840 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
32850 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
32860 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
32870 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
32880 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
32890 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
328a0 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
328b0 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
328c0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
328d0 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
328e0 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
328f0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
32900 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
32910 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
32920 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
32930 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
32940 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
32950 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
32960 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
32970 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
32980 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
32990 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
329a0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
329b0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
329c0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
329d0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
329e0 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
329f0 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
32a00 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
32a10 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
32a20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
32a30 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
32a40 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
32a50 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
32a60 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
32a70 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
32a80 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
32a90 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
32aa0 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
32ab0 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
32ac0 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
32ad0 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
32ae0 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
32af0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a   time and date .
32b00 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
32b10 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
32b20 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
32b30 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
32b40 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c  fs *NotUsed, sql
32b50 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
32b60 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  w){.  static con
32b70 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
32b80 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
32b90 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
32ba0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20  nt64)8640000;.  
32bb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32bc0 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  OK;.#if defined(
32bd0 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
32be0 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
32bf0 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28  );.  *piNow = ((
32c00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
32c10 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63  *1000 + unixEpoc
32c20 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f  h;.#elif OS_VXWO
32c30 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
32c40 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c  espec sNow;.  cl
32c50 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43  ock_gettime(CLOC
32c60 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f  K_REALTIME, &sNo
32c70 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75  w);.  *piNow = u
32c80 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
32c90 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
32ca0 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
32cb0 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30  w.tv_nsec/100000
32cc0 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
32cd0 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
32ce0 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64    if( gettimeofd
32cf0 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20  ay(&sNow, 0)==0 
32d00 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
32d10 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
32d20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
32d30 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
32d40 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
32d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
32d60 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
32d70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
32d80 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
32d90 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
32da0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
32db0 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
32dc0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
32dd0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
32de0 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
32df0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
32e00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32e10 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
32e20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
32e30 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
32e40 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
32e50 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
32e60 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
32e70 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
32e80 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
32e90 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
32ea0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
32eb0 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
32ec0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
32ed0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
32ee0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
32ef0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32f00 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
32f10 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32f20 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
32f30 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
32f40 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
32f50 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
32f60 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32f70 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
32f80 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
32f90 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
32fa0 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
32fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32fc0 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
32fd0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
32fe0 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
32ff0 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
33000 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
33010 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
33020 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
33030 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
33040 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
33050 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
33060 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
33070 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
33080 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
33090 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
330a0 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
330b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
330c0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
330d0 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
330e0 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
330f0 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
33100 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
33110 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
33120 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
33130 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
33140 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
33150 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33160 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
33170 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33180 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
33190 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
331a0 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
331b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
331c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
331d0 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
331e0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
331f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33200 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
33210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33250 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
33260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
332a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
332b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
332c0 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
332d0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
332e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
332f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
33300 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
33310 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
33320 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
33330 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
33340 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
33350 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
33360 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
33370 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
33380 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
33390 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
333a0 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
333b0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
333c0 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
333d0 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
333e0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
333f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
33400 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
33410 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
33420 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
33430 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
33440 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
33450 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
33460 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
33470 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
33480 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
33490 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
334a0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
334b0 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
334c0 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
334d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
334e0 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
334f0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
33500 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
33510 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
33520 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
33530 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
33540 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
33550 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
33560 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
33570 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
33580 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
33590 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
335a0 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
335b0 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
335c0 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
335d0 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
335e0 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
335f0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
33600 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
33610 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
33620 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
33630 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
33640 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
33650 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
33660 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
33670 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
33680 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
33690 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
336a0 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
336b0 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
336c0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
336d0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
336e0 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
336f0 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
33700 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
33710 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
33720 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
33730 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
33740 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
33750 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
33760 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
33770 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
33780 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
33790 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
337a0 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
337b0 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
337c0 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
337d0 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
337e0 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45  000.**      RESE
337f0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
33800 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
33810 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
33820 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33830 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
33840 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
33850 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
33860 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
33870 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
33880 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
33890 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
338a0 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
338b0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
338c0 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
338d0 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
338e0 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
338f0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
33900 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
33910 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
33920 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
33930 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
33940 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
33950 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
33960 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
33970 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
33980 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
33990 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
339a0 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
339b0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
339c0 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
339d0 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
339e0 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
339f0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
33a00 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
33a10 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
33a20 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
33a30 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
33a40 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
33a50 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
33a60 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
33a70 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
33a80 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
33a90 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
33aa0 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
33ab0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
33ac0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
33ad0 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
33ae0 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
33af0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
33b00 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
33b10 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
33b20 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
33b30 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
33b40 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
33b50 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
33b60 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
33b70 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
33b80 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
33b90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
33ba0 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
33bb0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
33bc0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
33bd0 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
33be0 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
33bf0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
33c00 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
33c10 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
33c20 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
33c30 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
33c40 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
33c50 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
33c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c70 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
33c80 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
33c90 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
33ca0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
33cb0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
33cc0 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
33cd0 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
33ce0 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
33cf0 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
33d00 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
33d10 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
33d20 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
33d30 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
33d40 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
33d50 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
33d60 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
33d70 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
33d80 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
33d90 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
33da0 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
33db0 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
33dc0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
33dd0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
33de0 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
33df0 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
33e00 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
33e10 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
33e20 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
33e30 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
33e40 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
33e50 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
33e60 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
33e70 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
33e80 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
33e90 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
33ea0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
33eb0 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
33ec0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
33ed0 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
33ee0 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
33ef0 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
33f00 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
33f10 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
33f20 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
33f30 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
33f40 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
33f50 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
33f60 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
33f70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
33f80 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
33f90 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
33fa0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
33fb0 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
33fc0 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
33fd0 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
33fe0 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
33ff0 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
34000 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
34010 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
34020 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
34030 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
34040 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
34050 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
34060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34070 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
34080 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
34090 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
340a0 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
340b0 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
340c0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
340d0 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
340e0 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
340f0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
34100 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
34110 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
34120 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
34130 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
34140 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
34150 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
34160 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
34170 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
34180 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
34190 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
341a0 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
341b0 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
341c0 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
341d0 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
341e0 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
341f0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
34200 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
34210 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
34220 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
34230 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
34240 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
34250 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
34260 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
34270 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
34280 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
34290 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
342a0 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
342b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
342c0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
342d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
342e0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
342f0 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
34300 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
34310 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
34320 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
34330 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
34340 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
34350 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
34360 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
34370 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
34380 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
34390 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
343a0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
343b0 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
343c0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
343d0 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
343e0 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
343f0 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
34400 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
34410 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
34420 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
34430 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
34440 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
34450 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
34460 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
34470 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
34480 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
34490 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
344a0 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
344b0 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
344c0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
344d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
344e0 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
344f0 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
34500 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
34510 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
34520 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
34530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34540 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
34550 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
34560 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
34570 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
34580 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
34590 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
345a0 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
345b0 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
345c0 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
345d0 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
345e0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
345f0 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
34600 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
34610 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
34620 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
34630 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
34640 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
34650 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
34660 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
34670 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
34680 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
34690 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
346a0 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
346b0 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
346c0 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
346d0 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
346e0 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
346f0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
34700 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
34710 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
34720 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
34730 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
34740 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
34750 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
34760 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
34770 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
34780 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
34790 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
347a0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
347b0 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
347c0 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
347d0 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
347e0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
347f0 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
34800 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
34810 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
34820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34830 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
34840 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
34850 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
34860 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
34870 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
34880 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
34890 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
348a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
348b0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
348c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
348d0 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
348e0 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
348f0 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
34900 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
34910 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
34920 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
34930 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
34940 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
34950 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
34960 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
34970 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
34980 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
34990 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
349a0 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
349b0 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
349c0 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
349d0 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
349e0 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
349f0 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
34a00 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
34a10 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
34a20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
34a30 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
34a40 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
34a50 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
34a60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
34a70 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
34a80 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
34a90 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
34aa0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
34ab0 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
34ac0 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
34ad0 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
34ae0 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
34af0 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
34b00 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
34b10 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
34b20 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
34b30 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
34b40 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
34b50 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
34b60 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
34b70 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
34b80 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
34b90 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
34ba0 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
34bb0 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
34bc0 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
34bd0 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
34be0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
34bf0 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
34c00 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
34c10 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
34c20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
34c30 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
34c40 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
34c50 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
34c60 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
34c70 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
34c80 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
34c90 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
34ca0 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
34cb0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
34cc0 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
34cd0 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
34ce0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
34cf0 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
34d00 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
34d10 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
34d20 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
34d30 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
34d40 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
34d50 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
34d60 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
34d70 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
34d80 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
34d90 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
34da0 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
34db0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
34dc0 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
34dd0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
34de0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
34df0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
34e00 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
34e10 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
34e20 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
34e30 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
34e40 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
34e50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
34e60 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
34e70 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
34e80 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
34e90 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
34ea0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
34eb0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
34ec0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
34ed0 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
34ee0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
34ef0 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
34f00 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
34f10 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
34f20 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
34f30 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
34f40 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
34f50 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
34f60 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
34f70 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
34f80 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
34f90 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
34fa0 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
34fb0 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
34fc0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
34fd0 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
34fe0 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
34ff0 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
35000 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
35010 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
35020 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
35030 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
35040 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
35050 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
35060 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
35070 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
35080 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
35090 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
350a0 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
350b0 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
350c0 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
350d0 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
350e0 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
350f0 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
35100 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
35110 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
35120 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
35130 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
35140 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
35150 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
35160 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
35170 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
35180 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
35190 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
351a0 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
351b0 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
351c0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
351d0 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
351e0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
351f0 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
35200 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
35210 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
35220 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
35230 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
35240 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
35250 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
35260 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
35270 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
35280 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
35290 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
352a0 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
352b0 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
352c0 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
352d0 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
352e0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
352f0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
35300 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
35310 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
35320 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
35330 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
35340 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
35350 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
35360 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
35370 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
35380 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
35390 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
353a0 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
353b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
353c0 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
353d0 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
353e0 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
353f0 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
35400 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
35410 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
35420 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
35430 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
35440 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
35450 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
35460 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
35470 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
35480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
35490 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
354a0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
354b0 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
354c0 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
354d0 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
354e0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
354f0 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
35500 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
35510 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
35520 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
35530 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
35540 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
35550 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
35560 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
35570 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
35580 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
35590 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
355a0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
355b0 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
355c0 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
355d0 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
355e0 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
355f0 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
35600 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
35610 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
35620 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
35630 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
35640 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
35650 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
35660 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
35670 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
35680 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
35690 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
356a0 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
356b0 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
356c0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
356d0 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
356e0 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
356f0 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
35700 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  ';.        if( o
35710 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49  sMkdir(buf, SQLI
35720 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
35730 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
35740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
35750 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
35760 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
35770 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
35780 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
35790 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
357a0 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
357b0 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
357c0 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
357d0 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
357e0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35800 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
35810 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
35820 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
35830 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
35840 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
35850 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35860 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
35870 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
35880 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
35890 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
358a0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
358b0 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
358c0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
358d0 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  n", lockPath, ge
358e0 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
358f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
35900 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
35910 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35920 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
35930 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
35940 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
35950 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
35960 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
35970 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
35980 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
35990 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
359a0 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
359b0 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
359c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
359d0 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
359e0 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
359f0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
35a00 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
35a10 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
35a20 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
35a30 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
35a40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
35a50 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
35a60 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
35a70 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
35a80 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
35a90 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
35aa0 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
35ab0 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
35ac0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
35ad0 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
35ae0 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
35af0 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
35b00 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
35b10 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
35b20 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
35b30 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
35b40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
35b50 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
35b60 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
35b70 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
35b80 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
35b90 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
35ba0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
35bb0 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
35bc0 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
35bd0 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
35be0 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
35bf0 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
35c00 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
35c10 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
35c20 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
35c30 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
35c40 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
35c50 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
35c60 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
35c70 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
35c80 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
35c90 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
35ca0 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
35cb0 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
35cc0 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
35cd0 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
35ce0 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
35cf0 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
35d00 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
35d10 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
35d20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
35d30 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
35d40 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
35d50 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
35d60 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
35d70 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
35d80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
35d90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
35da0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
35db0 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62   ){.    fd = rob
35dc0 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
35dd0 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
35de0 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
35df0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
35e00 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  & errno==ENOENT 
35e10 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b  && islockfile ){
35e20 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79  .      if( proxy
35e30 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70  CreateLockPath(p
35e40 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f  ath) == SQLITE_O
35e50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20  K ){.        fd 
35e60 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
35e70 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
35e80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35e90 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
35ea0 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
35eb0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
35ec0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
35ed0 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
35ee0 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e  s, 0);.    terrn
35ef0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
35f00 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
35f10 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
35f20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
35f30 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
35f40 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
35f50 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
35f60 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
35f70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35f80 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
35f90 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
35fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
35fb0 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
35fc0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
35fd0 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
35fe0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
35ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36000 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
36010 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
36020 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
36030 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
36040 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
36050 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
36060 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
36070 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
36080 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
36090 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
360a0 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
360b0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
360c0 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
360d0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
360e0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56    memset(&dummyV
360f0 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  fs, 0, sizeof(du
36100 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d  mmyVfs));.  dumm
36110 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
36120 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
36130 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d  IoFinder;.  dumm
36140 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75  yVfs.zName = "du
36150 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d  mmy";.  pUnused-
36160 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75  >fd = fd;.  pUnu
36170 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65  sed->flags = ope
36180 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  nFlags;.  pNew->
36190 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
361a0 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  d;.  .  rc = fil
361b0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
361c0 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69  myVfs, fd, (sqli
361d0 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
361e0 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20  path, 0);.  if( 
361f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36200 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
36210 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
36220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
36230 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
36240 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c      .  robust_cl
36250 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f  ose(pNew, fd, __
36260 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74  LINE__);.  sqlit
36270 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
36280 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
36290 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  nused);.  return
362a0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
362b0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69  QLITE_TEST./* si
362c0 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
362d0 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
362e0 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
362f0 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e  file paths */.in
36300 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
36310 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  _num = 0;.#endif
36320 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ..#define PROXY_
36330 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20  HOSTIDLEN    16 
36340 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
36350 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f  ost id length */
36360 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20  ../* Not always 
36370 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68  defined in the h
36380 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67  eaders as it oug
36390 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65  ht to be */.exte
363a0 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75  rn int gethostuu
363b0 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f  id(uuid_t id, co
363c0 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
363d0 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20  pec *wait);../* 
363e0 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
363f0 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
36400 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
36410 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
36420 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
36430 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
36440 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
36450 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
36460 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
36470 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
36480 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65  *pError){.  asse
36490 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
364a0 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
364b0 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
364c0 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
364d0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
364e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f  f defined(__MAX_
364f0 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
36500 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20  _REQUIRED)\.    
36510 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f             && __
36520 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
36530 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30  _MIN_REQUIRED<10
36540 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  50.  {.    stati
36550 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  c const struct t
36560 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
36570 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
36580 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
36590 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
365a0 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
365b0 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
365c0 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
365d0 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
365e0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
365f0 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
36600 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
36610 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
36620 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
36630 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36640 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
36650 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
36660 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
36670 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
36680 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
36690 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
366a0 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
366b0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
366c0 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
366d0 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
366e0 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
366f0 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
36700 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
36710 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
36720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36730 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
36740 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
36750 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
36760 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
36770 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
36780 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
36790 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
367a0 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
367b0 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
367c0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
367d0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
367e0 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
367f0 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
36800 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
36810 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
36820 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
36830 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36840 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
36850 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
36860 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
36870 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
36880 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
36890 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
368a0 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
368b0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
368c0 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
368d0 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
368e0 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
368f0 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
36900 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
36910 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
36920 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
36930 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
36940 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
36950 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
36960 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
36970 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
36980 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
36990 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
369a0 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
369b0 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
369c0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
369d0 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
369e0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
369f0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36a00 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36a10 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36a20 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
36a30 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36a40 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36a50 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
36a60 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
36a70 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
36a80 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
36a90 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
36aa0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
36ab0 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
36ac0 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
36ad0 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
36ae0 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
36af0 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
36b00 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
36b10 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
36b20 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
36b30 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
36b40 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
36b50 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
36b60 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
36b70 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
36b80 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
36b90 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
36ba0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
36bb0 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
36bc0 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
36bd0 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
36be0 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
36bf0 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
36c00 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
36c10 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
36c20 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
36c30 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
36c40 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
36c50 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
36c60 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
36c70 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
36c80 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
36c90 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
36ca0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
36cb0 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
36cc0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
36cd0 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
36ce0 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
36cf0 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
36d00 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
36d10 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
36d20 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
36d30 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
36d40 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
36d50 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
36d60 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
36d70 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
36d80 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
36d90 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
36da0 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
36db0 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
36dc0 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 66  CL), 0);.  if( f
36dd0 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
36de0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36df0 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
36e00 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
36e10 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
36e20 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
36e30 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
36e40 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c  if( osPwrite(fd,
36e50 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
36e60 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
36e70 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
36e80 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
36e90 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
36ea0 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
36eb0 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
36ec0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
36ed0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
36ee0 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
36ef0 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
36f00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36f10 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
36f20 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
36f30 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
36f40 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
36f50 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
36f60 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
36f70 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
36f80 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
36f90 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
36fa0 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f  h);.  robust_clo
36fb0 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46  se(pFile, conchF
36fc0 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
36fd0 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
36fe0 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
36ff0 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
37000 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
37010 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
37020 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
37030 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
37040 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74        osUnlink(t
37050 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62  Path);.      rob
37060 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
37070 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
37080 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
37090 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
370a0 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65  d to break stale
370b0 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c   lock on %s, %s\
370c0 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73  n", cPath, errms
370d0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
370e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20   rc;.}../* Take 
370f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
37100 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
37110 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61  file and break a
37120 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74   stale lock if t
37130 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d  he .** host id m
37140 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  atches..*/.stati
37150 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68  c int proxyConch
37160 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
37170 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
37180 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54  ostID, int lockT
37190 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ype){.  proxyLoc
371a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
371b0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
371c0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
371d0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
371e0 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
371f0 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
37200 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e  >conchFile;.  in
37210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37220 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d  ;.  int nTries =
37230 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d   0;.  struct tim
37240 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69  espec conchModTi
37250 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  me;.  .  memset(
37260 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30  &conchModTime, 0
37270 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f  , sizeof(conchMo
37280 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a  dTime));.  do {.
37290 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
372a0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
372b0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
372c0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
372d0 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69  kType);.    nTri
372e0 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72  es ++;.    if( r
372f0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
37300 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
37310 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
37320 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
37330 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
37340 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
37350 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
37360 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
37370 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
37380 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
37390 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
373a0 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
373b0 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
373c0 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
373d0 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
373e0 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
373f0 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
37400 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
37410 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
37420 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
37430 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
37440 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
37450 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63  if( osFstat(conc
37460 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
37470 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
37480 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
37490 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
374a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
374b0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
374c0 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
374d0 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20  nTries==1 ){.   
374e0 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
374f0 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65  e = buf.st_mtime
37500 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73  spec;.        us
37510 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a  leep(500000); /*
37520 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e   wait 0.5 sec an
37530 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
37540 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63  gain*/.        c
37550 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
37560 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
37570 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20  ( nTries>1 );.  
37580 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64      if( conchMod
37590 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62  Time.tv_sec != b
375a0 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
375b0 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20  tv_sec || .     
375c0 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
375d0 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e  .tv_nsec != buf.
375e0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
375f0 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nsec ){.        
37600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
37610 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SY;.      }.    
37620 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37630 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20  ies==2 ){  .    
37640 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52      char tBuf[PR
37650 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
37660 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  ;.        int le
37670 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
37680 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20  hFile->h, tBuf, 
37690 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
376a0 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  N, 0);.        i
376b0 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  f( len<0 ){.    
376c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
376d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
376e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
376f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37700 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  CK;.        }.  
37710 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52        if( len>PR
37720 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26  OXY_PATHINDEX &&
37730 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29   tBuf[0]==(char)
37740 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
37750 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ON){.          /
37760 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
37770 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f  e lock if the ho
37780 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61  st id doesn't ma
37790 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
377a0 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26   if( 0!=memcmp(&
377b0 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  tBuf[PROXY_HEADE
377c0 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
377d0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
377e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
377f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37800 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
37810 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
37820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
37830 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
37840 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20  k on short read 
37850 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73  or a version mis
37860 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
37870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37880 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
37890 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
378a0 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  10000000); /* wa
378b0 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72  it 10 sec and tr
378c0 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
378d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
378e0 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20  inue; .      }. 
378f0 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65       .      asse
37900 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b  rt( nTries==3 );
37910 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72  .      if( 0==pr
37920 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
37930 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
37940 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  D) ){.        rc
37950 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37960 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79        if( lockTy
37970 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
37980 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
37990 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
379a0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
379b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
379c0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
379d0 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20  LOCK);          
379e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
379f0 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
37a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
37a10 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37a20 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37a30 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37a40 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37a50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37a60 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72    }.  } while( r
37a70 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
37a80 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20  & nTries<3 );.  
37a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37aa0 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f  ./* Takes the co
37ab0 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20  nch by taking a 
37ac0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
37ad0 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
37ae0 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20  s conch, if .** 
37af0 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d  lockPath is non-
37b00 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49  NULL, the host I
37b10 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  D and lock file 
37b20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e  path must match.
37b30 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63    A NULL .** loc
37b40 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74  kPath means that
37b50 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e   the lockPath in
37b60 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
37b70 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20  will be used if 
37b80 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73  the .** host IDs
37b90 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77   match, or a new
37ba0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
37bb0 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74  be generated aut
37bc0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61  omatically .** a
37bd0 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  nd written to th
37be0 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f  e conch file..*/
37bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37c00 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46  yTakeConch(unixF
37c10 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70  ile *pFile){.  p
37c20 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37c30 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
37c40 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37c50 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
37c60 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69  Context; .  .  i
37c70 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
37c80 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ld!=0 ){.    ret
37c90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
37ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
37cb0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
37cc0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
37cd0 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79  e;.    uuid_t my
37ce0 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20  HostID;.    int 
37cf0 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
37d00 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f  char readBuf[PRO
37d10 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37d20 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61  .    char lockPa
37d30 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
37d40 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f      char *tempLo
37d50 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ckPath = NULL;. 
37d60 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
37d70 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63  TE_OK;.    int c
37d80 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a  reateConch = 0;.
37d90 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61      int hostIdMa
37da0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tch = 0;.    int
37db0 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
37dc0 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b    int tryOldLock
37dd0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Path = 0;.    in
37de0 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61  t forceNewLockPa
37df0 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20  th = 0;.    .   
37e00 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
37e10 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
37e20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
37e30 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
37e40 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63        (pCtx->loc
37e50 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74  kProxyPath ? pCt
37e60 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
37e70 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
37e80 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72  tpid()));..    r
37e90 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74  c = proxyGetHost
37ea0 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45  ID(myHostID, &pE
37eb0 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rror);.    if( (
37ec0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
37ed0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
37ee0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
37ef0 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
37f00 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
37f10 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nch;.    }.    r
37f20 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
37f30 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
37f40 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ID, SHARED_LOCK)
37f50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
37f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37f70 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
37f80 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nch;.    }.    /
37f90 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74  * read the exist
37fa0 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  ing conch file *
37fb0 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20  /.    readLen = 
37fc0 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69  seekAndRead((uni
37fd0 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  xFile*)conchFile
37fe0 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52  , 0, readBuf, PR
37ff0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29  OXY_MAXCONCHLEN)
38000 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65  ;.    if( readLe
38010 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
38020 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45  I/O error: lastE
38030 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
38040 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20  AndRead */.     
38050 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
38060 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c  o = conchFile->l
38070 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
38080 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
38090 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f  R_READ;.      go
380a0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
380b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
380c0 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f  readLen<=(PROXY_
380d0 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
380e0 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20  HOSTIDLEN) || . 
380f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
38100 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52  Buf[0]!=(char)PR
38110 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
38120 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73   ){.      /* a s
38130 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72  hort read or ver
38140 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d  sion format mism
38150 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65  atch means we ne
38160 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
38170 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ew .      ** con
38180 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  ch file. .      
38190 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43  */.      createC
381a0 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  onch = 1;.    }.
381b0 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f      /* if the ho
381c0 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e  st id matches an
381d0 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  d the lock path 
381e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
381f0 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20  n the conch.    
38200 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20  ** we'll try to 
38210 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65  use the path the
38220 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20  re, if we can't 
38230 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20  open that path, 
38240 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65  we'll .    ** re
38250 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61  try with a new a
38260 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61  uto-generated pa
38270 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  th .    */.    d
38280 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77  o { /* in case w
38290 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67  e need to try ag
382a0 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f  ain for an :auto
382b0 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c  : named lock fil
382c0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
382d0 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20  !createConch && 
382e0 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74  !forceNewLockPat
382f0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73  h ){.        hos
38300 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63  tIdMatch = !memc
38310 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58  mp(&readBuf[PROX
38320 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
38330 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20  HostID, .       
38340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38350 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59             PROXY
38360 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20  _HOSTIDLEN);.   
38370 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63       /* if the c
38380 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f  onch has data co
38390 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
383a0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ts */.        if
383b0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
383c0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
383d0 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d      /* for auto-
383e0 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b  named local lock
383f0 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63   file, just chec
38400 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  k the host ID an
38410 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20  d we'll.        
38420 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f     ** use the lo
38430 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
38440 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64  th that's alread
38450 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20  y in there.     
38460 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
38470 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
38480 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
38490 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
384a0 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52   = (readLen - PR
384b0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a  OXY_PATHINDEX);.
384c0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
384d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74           if( pat
384e0 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e  hLen>=MAXPATHLEN
384f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
38500 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54    pathLen=MAXPAT
38510 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20  HLEN-1;.        
38520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
38530 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74    memcpy(lockPat
38540 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
38550 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61  Y_PATHINDEX], pa
38560 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  thLen);.        
38570 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74      lockPath[pat
38580 68 4c 65