/ Hex Artifact Content
Login

Artifact 7e2f6348e99bd215d36cb5d40161b06456089e21:


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 69 6e 63  MMAP_SIZE>0.#inc
0d10: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0d20: 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  >.#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 0a 23 20 69 6e 63  KING_STYLE.# inc
0d50: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
0d60: 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52  h>.# if OS_VXWOR
0d70: 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  KS.#  include <s
0d80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69  emaphore.h>.#  i
0d90: 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68  nclude <limits.h
0da0: 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c  >.# else.#  incl
0db0: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0dc0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
0dd0: 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69  /param.h>.# endi
0de0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
0df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0e00: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
0e10: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
0e20: 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e  _) || (SQLITE_EN
0e30: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0e40: 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
0e50: 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  S).# include <sy
0e60: 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69  s/mount.h>.#endi
0e70: 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  f..#ifdef HAVE_U
0e80: 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  TIME.# include <
0e90: 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a  utime.h>.#endif.
0ea0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
0eb0: 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c  alues of unixFil
0ec0: 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  e.fsFlags.*/.#de
0ed0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c  fine SQLITE_FSFL
0ee0: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20  AGS_IS_MSDOS    
0ef0: 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   0x1../*.** If w
0f00: 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65  e are to be thre
0f10: 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65  ad-safe, include
0f20: 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65   the pthreads he
0f30: 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a  ader and define.
0f40: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e  ** the SQLITE_UN
0f50: 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f  IX_THREADS macro
0f60: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0f70: 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63  THREADSAFE.# inc
0f80: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
0f90: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0fa0: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a  _UNIX_THREADS 1.
0fb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0fc0: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
0fd0: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
0fe0: 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69  a new file.*/.#i
0ff0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
1000: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
1010: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
1020: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
1030: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  LE_PERMISSIONS 0
1040: 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  644.#endif../*.*
1050: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1060: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1070: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1080: 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ir.*/.#ifndef SQ
1090: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
10a0: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
10b0: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
10c0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
10d0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  IR_PERMISSIONS 0
10e0: 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  755.#endif../*.*
10f0: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
1100: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
1110: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1120: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a  PATHNAME 512../*
1130: 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65  .** Only set the
1140: 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68   lastErrno if th
1150: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1160: 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64  a real error and
1170: 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61   not .** a norma
1180: 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  l expected retur
1190: 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  n code of SQLITE
11a0: 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f  _BUSY or SQLITE_
11b0: 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  OK.*/.#define IS
11c0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20  _LOCK_ERROR(x)  
11d0: 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ((x != SQLITE_OK
11e0: 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54  ) && (x != SQLIT
11f0: 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72  E_BUSY))../* For
1200: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1210: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1220: 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68  t unixShm unixSh
1230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1240: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73   /* Connection s
1250: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1260: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1270: 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53  nixShmNode unixS
1280: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a  hmNode;       /*
1290: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   Shared memory i
12a0: 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64  nstance */.typed
12b0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e  ef struct unixIn
12c0: 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64  odeInfo unixInod
12d0: 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69  eInfo;   /* An i
12e0: 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66  -node */.typedef
12f0: 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73   struct UnixUnus
1300: 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46  edFd UnixUnusedF
1310: 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75  d;     /* An unu
1320: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1330: 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  tor */../*.** So
1340: 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61  metimes, after a
1350: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20   file handle is 
1360: 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65  closed by SQLite
1370: 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  , the file descr
1380: 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20  iptor.** cannot 
1390: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
13a0: 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20  ately. In these 
13b0: 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73  cases, instances
13c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
13d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61  g.** structure a
13e0: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
13f0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1400: 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69  ptor while waiti
1410: 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70  ng for an.** opp
1420: 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68  ortunity to eith
1430: 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73  er close or reus
1440: 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  e it..*/.struct 
1450: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20  UnixUnusedFd {. 
1460: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
1470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1480: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1490: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20   close */.  int 
14a0: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
14b0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
14c0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
14d0: 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77  tor was opened w
14e0: 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  ith */.  UnixUnu
14f0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20  sedFd *pNext;   
1500: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65     /* Next unuse
1510: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1520: 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a  r on same file *
1530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
1540: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1550: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
1560: 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  f sqlite3_file s
1570: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 75  pecific to the u
1580: 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65  nix.** VFS imple
1590: 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74  mentations..*/.t
15a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
15b0: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
15c0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
15d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
15e0: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
15f0: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
1600: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
1610: 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
1620: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1640: 68 65 20 56 46 53 20 74 68 61 74 20 63 72 65 61  he VFS that crea
1650: 74 65 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ted this unixFil
1660: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
1670: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1690: 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f  fo about locks o
16a0: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
16b0: 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20    int h;        
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
16e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
16f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1700: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
1710: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
1720: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
1730: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75  n this fd */.  u
1740: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
1750: 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20  t ctrlFlags;    
1760: 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c     /* Behavioral
1770: 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45   bits.  UNIXFILE
1780: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  _* flags */.  in
1790: 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  t lastErrno;    
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
17c0: 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f  rno from last I/
17d0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
17e0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
1810: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
1820: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
1830: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
1840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1850: 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55  -allocated UnixU
1860: 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e  nusedFd */.  con
1870: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18a0: 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
18b0: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
18e0: 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69  egment informati
18f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  on */.  int szCh
1900: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1920: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
1930: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
1940: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1950: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1960: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1990: 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
19a0: 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69  h refs */.  sqli
19b0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
19c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
19d0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
19e0: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
19f0: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
1a00: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1a10: 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20  izeActual;      
1a20: 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20   /* Actual size 
1a30: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1a40: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1a50: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1a60: 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20  SizeMax;        
1a70: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20    /* Configured 
1a80: 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
1a90: 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20  value */.  void 
1aa0: 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20  *pMapRegion;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac0: 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  * Memory mapped 
1ad0: 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66  region */.#endif
1ae0: 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1af0: 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  __.  int sectorS
1b00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
1b20: 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a  ce sector size *
1b30: 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68  /.  int deviceCh
1b40: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f          /* Preco
1b60: 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68  mputed device ch
1b70: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1b80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1ba0: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1bb0: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1be0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1bf0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1c00: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1c10: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1c20: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1c30: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1c40: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1c50: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1c60: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1c70: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1c80: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1c90: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
1ca0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20  leId *pId;      
1cb0: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
1cc0: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
1cd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1ce0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  BUG.  /* The nex
1cf0: 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61  t group of varia
1d00: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
1d10: 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f   track whether o
1d20: 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74  r not the.  ** t
1d30: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1d40: 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32  er in bytes 24-2
1d50: 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  7 of database fi
1d60: 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a  les are updated.
1d70: 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e    ** whenever an
1d80: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
1d90: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
1da0: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
1db0: 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63  ult will.  ** oc
1dc0: 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73  cur if a file is
1dd0: 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74   updated without
1de0: 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74   also updating t
1df0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
1e00: 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68   ** counter.  Th
1e10: 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20  is test is made 
1e20: 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f  to avoid new pro
1e30: 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f  blems similar to
1e40: 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65   the.  ** one de
1e50: 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65  scribed by ticke
1e60: 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20  t #3584. .  */. 
1e70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
1e80: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20  ransCntrChng;   
1e90: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
1ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1eb0: 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  er changed */.  
1ec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62  unsigned char db
1ed0: 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f  Update;        /
1ee0: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
1ef0: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  rt of database f
1f00: 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ile changed */. 
1f10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
1f20: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20  nNormalWrite;   
1f30: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20  /* True if in a 
1f40: 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65  normal write ope
1f50: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69  ration */..#endi
1f60: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1f70: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
1f80: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
1f90: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1fa0: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
1fb0: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
1fc0: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
1fd0: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
1fe0: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
1ff0: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2000: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
2010: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
2020: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c  ./* This variabl
2030: 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72 6f 63  e holds the proc
2040: 65 73 73 20 69 64 20 28 70 69 64 29 20 66 72 6f  ess id (pid) fro
2050: 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61 6e 64  m when the xRand
2060: 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68  omness().** meth
2070: 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20  od was called.  
2080: 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61  If xOpen() is ca
2090: 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69 66 66  lled from a diff
20a0: 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20 69 64  erent process id
20b0: 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
20c0: 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20 68 61  that a fork() ha
20d0: 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20  s occurred, the 
20e0: 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72 65 73  PRNG will be res
20f0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
2100: 74 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20  t randomnessPid 
2110: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  = 0;../*.** Allo
2120: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74  wed values for t
2130: 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c  he unixFile.ctrl
2140: 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a  Flags bitmask:.*
2150: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2160: 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30  LE_EXCL        0
2170: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2180: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
2190: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
21a0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
21b0: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30  _RDONLY      0x0
21c0: 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  2     /* Connect
21d0: 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79  ion is read only
21e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
21f0: 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
2200: 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72   0x04     /* Per
2210: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
2220: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2230: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
2240: 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58  NC.# define UNIX
2250: 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20  FILE_DIRSYNC    
2260: 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65  0x08     /* Dire
2270: 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65  ctory sync neede
2280: 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66  d */.#else.# def
2290: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  ine UNIXFILE_DIR
22a0: 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e  SYNC    0x00.#en
22b0: 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  dif.#define UNIX
22c0: 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20  FILE_PSOW       
22d0: 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c   0x10     /* SQL
22e0: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
22f0: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
2300: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2310: 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30 78  E_DELETE      0x
2320: 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  20     /* Delete
2330: 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65   on close */.#de
2340: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52  fine UNIXFILE_UR
2350: 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20 20  I         0x40  
2360: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d     /* Filename m
2370: 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79 20  ight have query 
2380: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64  parameters */.#d
2390: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e  efine UNIXFILE_N
23a0: 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20  OLOCK      0x80 
23b0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c      /* Do no fil
23c0: 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65  e locking */.#de
23d0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 57 41  fine UNIXFILE_WA
23e0: 52 4e 45 44 20 20 20 20 30 78 30 31 30 30 20 20  RNED    0x0100  
23f0: 20 20 20 2f 2a 20 76 65 72 69 66 79 44 62 46 69     /* verifyDbFi
2400: 6c 65 28 29 20 77 61 72 6e 69 6e 67 73 20 68 61  le() warnings ha
2410: 76 65 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a  ve been issued *
2420: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
2430: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
2440: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
2450: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
2460: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
2470: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
2480: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
2490: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
24a0: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
24b0: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
24c0: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
24d0: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
24e0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
24f0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
2500: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
2510: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2520: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2530: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
2540: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
2550: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
2560: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
2570: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
2580: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
2590: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
25a0: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
25b0: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
25c0: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
25d0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
25e0: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
25f0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
2600: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2610: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
2620: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
2630: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
2640: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
2650: 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d  ./*.** HAVE_MREM
2660: 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74  AP defaults to t
2670: 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64  rue on Linux and
2680: 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72   false everywher
2690: 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  e else..*/.#if !
26a0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45  defined(HAVE_MRE
26b0: 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65  MAP).# if define
26c0: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
26d0: 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
26e0: 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48  RCE).#  define H
26f0: 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65  AVE_MREMAP 1.# e
2700: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41  lse.#  define HA
2710: 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e  VE_MREMAP 0.# en
2720: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
2730: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2740: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2750: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2760: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2770: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
2780: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
2790: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
27a0: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
27b0: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
27c0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
27d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
27e0: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
27f0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
2800: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
2810: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2820: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2830: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2840: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2850: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2860: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2870: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
2880: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2890: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
28a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
28b0: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
28c0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
28d0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
28e0: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mode);.}../*.** 
28f0: 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
2900: 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e   calls to fchown
2910: 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65 72 20  () will trigger 
2920: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61 20 73  a message in a s
2930: 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69  ecurity.** log i
2940: 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d  f they come from
2950: 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73   non-root proces
2960: 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64 20 63  ses.  So avoid c
2970: 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29 20  alling fchown() 
2980: 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74  if.** we are not
2990: 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
29a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29b0: 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e 74 20  posixFchown(int 
29c0: 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20 67  fd, uid_t uid, g
29d0: 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72 65 74  id_t gid){.  ret
29e0: 75 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f 20  urn geteuid() ? 
29f0: 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75 69  0 : fchown(fd,ui
2a00: 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f  d,gid);.}../* Fo
2a10: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
2a30: 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
2a40: 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a  t char*, int*);.
2a50: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
2a60: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
2a70: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
2a80: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
2a90: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
2aa0: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
2ab0: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
2ac0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
2ad0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
2ae0: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
2af0: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
2b00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
2b10: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
2b20: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
2b30: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
2b40: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
2b50: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
2b60: 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73   struct unix_sys
2b70: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
2b80: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
2b90: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2ba0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
2bb0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
2bc0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
2bd0: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
2be0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
2bf0: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2c00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2c10: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
2c20: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
2c30: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
2c40: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
2c50: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2c60: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
2c70: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
2c80: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
2c90: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
2ca0: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
2cb0: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
2cc0: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
2cd0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2ce0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
2cf0: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
2d00: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
2d10: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2d20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
2d30: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
2d40: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
2d50: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2d60: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
2d70: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
2d80: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
2d90: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2da0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
2db0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
2dc0: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
2dd0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2de0: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
2df0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
2e00: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
2e10: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
2e20: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
2e30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
2e40: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
2e50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2e60: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
2e70: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
2e80: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
2e90: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
2ea0: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
2eb0: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
2ec0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
2ed0: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
2ee0: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
2ef0: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
2f00: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
2f10: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
2f20: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
2f30: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
2f40: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
2f50: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
2f60: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
2f70: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
2f80: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
2f90: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
2fa0: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
2fb0: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
2fc0: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
2fd0: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
2fe0: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3000: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
3010: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
3020: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
3030: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
3040: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3050: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
3060: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3070: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
3080: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
3090: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
30a0: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
30b0: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
30c0: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
30d0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
30e0: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
30f0: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
3100: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3110: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
3120: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3130: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
3140: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3150: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
3160: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3170: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
3180: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
3190: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
31a0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
31b0: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
31c0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
31d0: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
31e0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
31f0: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
3200: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
3210: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3220: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
3230: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
3240: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
3250: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3260: 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  YLE.  { "pread",
3270: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3280: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
3290: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
32a0: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
32b0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
32c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
32d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
32e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
32f0: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
3300: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3310: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
3320: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
3330: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3340: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
3350: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
3360: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3370: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
3380: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
3390: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
33a0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
33b0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
33c0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
33d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
33e0: 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74  ad64   ((ssize_t
33f0: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
3400: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
3410: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
3420: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
3430: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3440: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
3450: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
3460: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
3470: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3480: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3490: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
34a0: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
34b0: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
34c0: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
34d0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
34e0: 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74  STYLE.  { "pwrit
34f0: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
3500: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3510: 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c  write,     0  },
3520: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
3530: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
3540: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3550: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3560: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3570: 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73   osPwrite    ((s
3580: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3590: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
35a0: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
35c0: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
35d0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
35e0: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
35f0: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
3600: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3610: 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34  all_ptr)pwrite64
3620: 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a  ,   0  },.#else.
3630: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
3640: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3650: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3660: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3670: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69  f.#define osPwri
3680: 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28  te64  ((ssize_t(
3690: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
36a0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
36b0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
36c0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
36d0: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
36e0: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
36f0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3700: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
3710: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3720: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
3730: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
3740: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
3750: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3760: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3770: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
3780: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
3790: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
37a0: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
37b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
37c0: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
37d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
37e0: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
37f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3800: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3810: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3820: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
3830: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
3840: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
3850: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3860: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
3870: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
3880: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3890: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
38a0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
38b0: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
38c0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
38d0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
38e0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
38f0: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
3900: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3910: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
3920: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
3930: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
3940: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
3950: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3960: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
3970: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3980: 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  mkdir",        (
3990: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
39a0: 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20  ptr)mkdir,      
39b0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
39c0: 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28  e osMkdir     ((
39d0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
39e0: 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  r*,mode_t))aSysc
39f0: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
3a00: 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20  )..  { "rmdir", 
3a10: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3a20: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69  syscall_ptr)rmdi
3a30: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
3a40: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69  ,.#define osRmdi
3a50: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
3a60: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3a70: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3a80: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  t)..  { "fchown"
3a90: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3aa0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
3ab0: 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30 20  ixFchown,     0 
3ac0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68  },.#define osFch
3ad0: 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28  own    ((int(*)(
3ae0: 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29  int,uid_t,gid_t)
3af0: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3b00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
3b10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3b20: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
3b30: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
3b40: 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20  .  { "mmap",    
3b50: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b60: 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20  all_ptr)mmap,   
3b70: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3b80: 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  sMmap ((void*(*)
3b90: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e  (void*,size_t,in
3ba0: 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29  t,int,int,off_t)
3bb0: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
3bc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75  urrent)..  { "mu
3bd0: 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  nmap",       (sq
3be0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3bf0: 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20  r)munmap,       
3c00: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3c10: 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a  osMunmap ((void*
3c20: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
3c30: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
3c40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41  Current)..#if HA
3c50: 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d  VE_MREMAP.  { "m
3c60: 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73  remap",       (s
3c70: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3c80: 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20  tr)mremap,      
3c90: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3ca0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
3cb0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3cc0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3cd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ce0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d  ndif.#define osM
3cf0: 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  remap ((void*(*)
3d00: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69  (void*,size_t,si
3d10: 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  ze_t,int,...))aS
3d20: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
3d30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20  ent).#endif..}; 
3d40: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3d50: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3d60: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
3d70: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
3d80: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
3d90: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
3da0: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
3db0: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
3dc0: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
3dd0: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
3de0: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
3df0: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
3e00: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
3e10: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3e20: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
3e30: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
3e40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3e50: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
3e60: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
3e70: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
3e80: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
3e90: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
3ea0: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
3eb0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
3ec0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3ee0: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
3ef0: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
3f00: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3f10: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
3f20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
3f30: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
3f40: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
3f50: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
3f60: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
3f70: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
3f80: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
3f90: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
3fa0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
3fb0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
3fc0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
3fd0: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
3fe0: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
3ff0: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
4000: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
4010: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
4020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4030: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4040: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4050: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4060: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4070: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4080: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
4090: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
40a0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
40b0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
40c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
40d0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
40e0: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
40f0: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
4100: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
4110: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
4120: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
4130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
4140: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4150: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4160: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
4170: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4180: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4190: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
41a0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
41b0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
41c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
41d0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
41e0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
41f0: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
4200: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
4210: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4220: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
4230: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
4240: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4250: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
4260: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4270: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
4280: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4290: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
42a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
42b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
42c0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
42d0: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
42e0: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
42f0: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
4300: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
4310: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
4320: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
4330: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
4340: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
4350: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
4360: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
4370: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
4380: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
4390: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
43a0: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
43b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
43c0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
43d0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
43e0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
43f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4400: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4410: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4420: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
4430: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4440: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4450: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
4460: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4470: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
4480: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
4490: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
44a0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
44b0: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
44c0: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
44d0: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
44e0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
44f0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
4500: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
4510: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
4520: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
4530: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
4540: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
4550: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
4560: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
4570: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4580: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
4590: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
45a0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
45b0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
45c0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
45d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
45e0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
45f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
4600: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
4610: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
4620: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4630: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4640: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4660: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
4670: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
4680: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
4690: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
46a0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
46b0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
46c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
46d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  }../*.** Do not 
46e0: 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20  accept any file 
46f0: 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20  descriptor less 
4700: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
4710: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
4720: 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61  id.** opening da
4730: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e  tabase file usin
4740: 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  g file descripto
4750: 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  rs that are comm
4760: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a  only used for .*
4770: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
4780: 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72  , output, and er
4790: 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ror..*/.#ifndef 
47a0: 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46  SQLITE_MINIMUM_F
47b0: 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23  ILE_DESCRIPTOR.#
47c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d   define SQLITE_M
47d0: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
47e0: 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a  RIPTOR 3.#endif.
47f0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70  ./*.** Invoke op
4800: 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c  en().  Do so mul
4810: 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74  tiple times, unt
4820: 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63  il it either suc
4830: 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c  ceeds or.** fail
4840: 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f  s for some reaso
4850: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e  n other than EIN
4860: 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  TR..**.** If the
4870: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
4880: 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65  ode "m" is 0 the
4890: 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  n set it to the 
48a0: 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53  default for.** S
48b0: 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61  QLite.  The defa
48c0: 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45  ult is SQLITE_DE
48d0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
48e0: 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79  SSIONS (normally
48f0: 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64  .** 0644) as mod
4900: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73  ified by the sys
4910: 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d  tem umask.  If m
4920: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a   is not 0, then.
4930: 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
4940: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62   creation mode b
4950: 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f  e exactly m igno
4960: 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a  ring the umask..
4970: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61  **.** The m para
4980: 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f  meter will be no
4990: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e  n-zero only when
49a0: 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20   creating -wal, 
49b0: 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64  -journal,.** and
49c0: 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65   -shm files.  We
49d0: 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65   want those file
49e0: 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74  s to have *exact
49f0: 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  ly* the same.** 
4a00: 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74  permissions as t
4a10: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
4a20: 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65  tabase, unadulte
4a30: 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  rated by the uma
4a40: 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77  sk..** In that w
4a50: 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73  ay, if a databas
4a60: 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77  e file is -rw-rw
4a70: 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d  -rw or -rw-rw-r-
4a80: 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73  , and a.** trans
4a90: 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61  action crashes a
4aa0: 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64  nd leaves behind
4ab0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   hot journals, t
4ac0: 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65  hen any.** proce
4ad0: 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20  ss that is able 
4ae0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
4af0: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c  database will al
4b00: 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a  so be able to.**
4b10: 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74   recover the hot
4b20: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74   journals..*/.st
4b30: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
4b40: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
4b50: 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f  *z, int f, mode_
4b60: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  t m){.  int fd;.
4b70: 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20    mode_t m2 = m 
4b80: 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46  ? m : SQLITE_DEF
4b90: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4ba0: 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31  SIONS;.  while(1
4bb0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ){.#if defined(O
4bc0: 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64  _CLOEXEC).    fd
4bd0: 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f   = osOpen(z,f|O_
4be0: 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c  CLOEXEC,m2);.#el
4bf0: 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  se.    fd = osOp
4c00: 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64  en(z,f,m2);.#end
4c10: 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  if.    if( fd<0 
4c20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
4c30: 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74  no==EINTR ) cont
4c40: 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61  inue;.      brea
4c50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
4c60: 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49   fd>=SQLITE_MINI
4c70: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
4c80: 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  TOR ) break;.   
4c90: 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20   osClose(fd);.  
4ca0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
4cb0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20  LITE_WARNING, . 
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
4cd0: 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  attempt to open 
4ce0: 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64  \"%s\" as file d
4cf0: 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a  escriptor %d", z
4d00: 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20  , fd);.    fd = 
4d10: 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70  -1;.    if( osOp
4d20: 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20  en("/dev/null", 
4d30: 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b  f, m)<0 ) break;
4d40: 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30  .  }.  if( fd>=0
4d50: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30   ){.    if( m!=0
4d60: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
4d70: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
4d80: 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
4d90: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d  (fd, &statbuf)==
4da0: 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61  0 .       && sta
4db0: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a  tbuf.st_size==0.
4dc0: 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62         && (statb
4dd0: 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  uf.st_mode&0777)
4de0: 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=m .      ){.  
4df0: 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66        osFchmod(f
4e00: 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, m);.      }. 
4e10: 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
4e20: 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20  (FD_CLOEXEC) && 
4e30: 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  (!defined(O_CLOE
4e40: 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45  XEC) || O_CLOEXE
4e50: 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74  C==0).    osFcnt
4e60: 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
4e70: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
4e80: 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
4e90: 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  XEC);.#endif.  }
4ea0: 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a  .  return fd;.}.
4eb0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
4ec0: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
4ed0: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
4ee0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
4ef0: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
4f00: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
4f10: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
4f20: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
4f30: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
4f40: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
4f50: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
4f60: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
4f70: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
4f80: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
4f90: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
4fa0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
4fb0: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
4fc0: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
4fd0: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
4fe0: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
4ff0: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
5000: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
5010: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
5020: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
5030: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
5040: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
5050: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
5060: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
5070: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
5080: 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74  rLeave().*/.stat
5090: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
50a0: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
50b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
50c0: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
50d0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
50e0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
50f0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5100: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5110: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
5120: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
5130: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5140: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5150: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
5160: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5170: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
5180: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
5190: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
51a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
51b0: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
51c0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
51d0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
51e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  .}.#endif...#if 
51f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
5200: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
5210: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
5220: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
5230: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
5240: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
5250: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
5260: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
5270: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
5280: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
5290: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
52a0: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
52b0: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
52c0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
52d0: 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28  har *azFileLock(
52e0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
52f0: 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c    switch( eFileL
5300: 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
5310: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
5320: 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65  "NONE";.    case
5330: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
5340: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
5350: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
5360: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52  _LOCK: return "R
5370: 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61  ESERVED";.    ca
5380: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
5390: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
53a0: 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c  ";.    case EXCL
53b0: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
53c0: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
53d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
53e0: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
53f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
5400: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
5410: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
5420: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
5430: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
5440: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
5450: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
5460: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
5470: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
5480: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
5490: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
54a0: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
54b0: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
54c0: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
54d0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
54e0: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
54f0: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
5500: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
5510: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
5520: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
5530: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
5540: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
5550: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
5560: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
5570: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
5580: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
5590: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
55a0: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
55b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
55c0: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
55d0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
55e0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
55f0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
5600: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
5610: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5620: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
5630: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
5640: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
5650: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
5660: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
5670: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5680: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
5690: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
56a0: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
56b0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
56c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
56d0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
56e0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
56f0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
5700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
5710: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5720: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
5730: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f  K_SET );.  s = o
5740: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
5750: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
5760: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
5770: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
5780: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
5790: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
57a0: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
57b0: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
57c0: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
57d0: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
57e0: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
57f0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
5800: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
5810: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
5820: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
5830: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
5840: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
5850: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
5860: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
5870: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
5880: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
5890: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
58a0: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
58b0: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
58c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
58d0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
58e0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
58f0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
5900: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
5910: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
5920: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
5930: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
5940: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
5950: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
5960: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5970: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
5980: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
5990: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
59a0: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
59b0: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
59c0: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
59d0: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
59e0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
59f0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75    return s;.}.#u
5a00: 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65  ndef osFcntl.#de
5a10: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63  fine osFcntl loc
5a20: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
5a30: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
5a40: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CE */../*.** Ret
5a50: 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63  ry ftruncate() c
5a60: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
5a70: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
5a80: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
5a90: 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68  _ftruncate(int h
5aa0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
5ab0: 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  sz){.  int rc;. 
5ac0: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75   do{ rc = osFtru
5ad0: 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68  ncate(h,sz); }wh
5ae0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
5af0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
5b00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5b10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5b20: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
5b30: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
5b40: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
5b50: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
5b60: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
5b70: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
5b80: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
5b90: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
5ba0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
5bb0: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
5bc0: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
5bd0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
5be0: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
5bf0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
5c00: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
5c10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
5c20: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
5c30: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
5c40: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
5c50: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
5c60: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
5c70: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
5c80: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
5c90: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
5ca0: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
5cb0: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
5cc0: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
5cd0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
5ce0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
5cf0: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
5d00: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
5d10: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
5d20: 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20  sixError) {.#if 
5d30: 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  0.  /* At one po
5d40: 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77 61  int this code wa
5d50: 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20  s not commented 
5d60: 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20  out. In theory, 
5d70: 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
5d80: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
5d90: 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75   hit, as this fu
5da0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e  nction should on
5db0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
5dc0: 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e  er.  ** a lockin
5dd0: 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  g-related functi
5de0: 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29  on (i.e. fcntl()
5df0: 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e  ) has returned n
5e00: 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a  on-zero with.  *
5e10: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  * the value of e
5e20: 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73  rrno as the firs
5e30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63  t argument. Sinc
5e40: 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  e a system call 
5e50: 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a  has failed,.  **
5e60: 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65   errno should be
5e70: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a   non-zero..  **.
5e80: 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69    ** Despite thi
5e90: 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c  s, if errno real
5ea0: 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73  ly is zero, we s
5eb0: 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20  till don't want 
5ec0: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
5ed0: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79  QLITE_OK. The sy
5ee0: 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64  stem call failed
5ef0: 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c  , and *some* SQL
5f00: 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64  ite error should
5f10: 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61   be.  ** propaga
5f20: 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ted back to the 
5f30: 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69  caller. Commenti
5f40: 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f  ng this branch o
5f50: 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d  ut means errno==
5f60: 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68  0.  ** will be h
5f70: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22 64  andled by the "d
5f80: 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65  efault:" case be
5f90: 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  low..  */.  case
5fa0: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
5fb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
5fc0: 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e  f..  case EAGAIN
5fd0: 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f  :.  case ETIMEDO
5fe0: 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59  UT:.  case EBUSY
5ff0: 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a  :.  case EINTR:.
6000: 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20    case ENOLCK:  
6010: 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e  .    /* random N
6020: 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20  FS retry error, 
6030: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
6040: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
6050: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
6060: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
6070: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
6080: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
6090: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
60a0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
60b0: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
60c0: 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69  .    /* EACCES i
60d0: 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75  s like EAGAIN du
60e0: 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65  ring locking ope
60f0: 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74  rations, but not
6100: 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a   any other time*
6110: 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  /.    if( (sqlit
6120: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6130: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
6140: 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  .        (sqlite
6150: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
6160: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
6170: 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74   .        (sqlit
6180: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6190: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
61a0: 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  |.        (sqlit
61b0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
61c0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
61d0: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
61e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
61f0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
6200: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
6210: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
6220: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
6230: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
6240: 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c      .  /* EDEADL
6250: 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  K is only possib
6260: 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  le if a call to 
6270: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20  fcntl(F_SETLKW) 
6280: 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a  is made. And.  *
6290: 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65  * this module ne
62a0: 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61  ver makes such a
62b0: 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63   call. And the c
62c0: 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74  ode in SQLite it
62d0: 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65 72  self .  ** asser
62e0: 74 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49  ts that SQLITE_I
62f0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20  OERR_BLOCKED is 
6300: 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20  never returned. 
6310: 46 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e  For these reason
6320: 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65  s.  ** this case
6330: 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
6340: 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73  ed out. If the s
6350: 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65  ystem does set e
6360: 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c  rrno to EDEADLK,
6370: 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  .  ** the defaul
6380: 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  t SQLITE_IOERR_X
6390: 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  XX code will be 
63a0: 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66  returned. */.#if
63b0: 20 30 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c   0.  case EDEADL
63c0: 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K:.    return SQ
63d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
63e0: 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a  ED;.#endif.    .
63f0: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
6400: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
6410: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
6420: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
6430: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
6440: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6450: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6460: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
6470: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
6480: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
6490: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
64a0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
64b0: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
64c0: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
64d0: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
64e0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
64f0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
6500: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
6510: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
6520: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
6530: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
6540: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
6550: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
6560: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
6570: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
6580: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
6590: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
65a0: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
65b0: 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20  #ifdef ESTALE   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e    /* ESTALE is n
65e0: 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e  ot defined on In
65f0: 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f  terix systems */
6600: 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a  .  case ESTALE:.
6610: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e  #endif.  case EN
6620: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
6630: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
6640: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
6650: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
6660: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
6670: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
6680: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
6690: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  IOErr;.  }.}.../
66a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
66f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6700: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
6710: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6720: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
6730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6740: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
6750: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
6760: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
6770: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
6780: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
6790: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
67a0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
67b0: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
67c0: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
67d0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
67e0: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
67f0: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
6800: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
6810: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
6820: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
6830: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
6840: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
6850: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
6860: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
6870: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
6880: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
6890: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
68a0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
68b0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
68c0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
68d0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
68e0: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
68f0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
6900: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
6910: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
6920: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
6930: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
6940: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
6950: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
6960: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
6970: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
6980: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
6990: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
69a0: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
69b0: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
69c0: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
69d0: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
69e0: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
69f0: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
6a00: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
6a10: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
6a20: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6a30: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
6a40: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
6a50: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
6a60: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
6a90: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
6aa0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
6ab0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6ac0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6ad0: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
6ae0: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
6af0: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
6b00: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
6b10: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
6b20: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
6b30: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
6b40: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
6b50: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
6b60: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
6b70: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
6b80: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
6b90: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
6ba0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6bb0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
6bc0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
6bd0: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
6be0: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
6bf0: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
6c00: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
6c10: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
6c20: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
6c30: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
6c40: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
6c50: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
6c60: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
6c70: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
6c80: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
6c90: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
6ca0: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
6cb0: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
6cc0: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
6cd0: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
6ce0: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
6cf0: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
6d00: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
6d10: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6d20: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
6d30: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
6d40: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
6d50: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
6d60: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
6d70: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
6d80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
6d90: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
6da0: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
6db0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6dc0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6dd0: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
6de0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6df0: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
6e00: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6e10: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
6e20: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
6e30: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
6e40: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6e50: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6e60: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
6e70: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
6e80: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
6e90: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
6ea0: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
6eb0: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
6ec0: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
6ed0: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
6ee0: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
6ef0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6f00: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
6f10: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
6f20: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
6f30: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
6f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
6f50: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
6f60: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
6f70: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
6f80: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
6f90: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
6fa0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6fb0: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
6fc0: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
6fd0: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
6fe0: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
6ff0: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
7000: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
7010: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
7020: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
7030: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
7040: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
7050: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
7060: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
7070: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
7080: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
7090: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
70a0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
70b0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
70c0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
70d0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
70e0: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
70f0: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
7100: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
7110: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
7120: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
7130: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
7140: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
7150: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
7160: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7170: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
7180: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
7190: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
71a0: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
71b0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
71e0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
71f0: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
7200: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
7210: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
7220: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
7230: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
7240: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
7250: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
7260: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7270: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7280: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7290: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
72a0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
72b0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
72c0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
72d0: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
72e0: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
72f0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7300: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7310: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7320: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7330: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7340: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7350: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7360: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7370: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7380: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
7390: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
73a0: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
73b0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
73c0: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
73d0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
73e0: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
73f0: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7400: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7410: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7420: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7430: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7440: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7450: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7460: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7470: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7480: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
7490: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
74a0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
74b0: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
74c0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
74d0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
74e0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
74f0: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7500: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7510: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7520: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7530: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7540: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7550: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7560: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7570: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7580: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
7590: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
75a0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
75b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
75d0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
75e0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
75f0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7600: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7610: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7620: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7630: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7640: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7650: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7660: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7670: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
7680: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
76a0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
76b0: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
76c0: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
76d0: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
76e0: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
76f0: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7700: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7710: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7720: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7730: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7740: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7750: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
7760: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
7770: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
7780: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
7790: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
77a0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
77b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
77c0: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
77d0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
77e0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a 2a 2a  ****************
7840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
7850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
78a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
78c0: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
78d0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
78e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
78f0: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7900: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7910: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7920: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7930: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7940: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7950: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
7960: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
7970: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
7980: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
7990: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
79a0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
79b0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
79c0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
79d0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
79e0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
79f0: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7a00: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7a10: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7a20: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7a30: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7a40: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7a50: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
7a60: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
7a70: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
7a80: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
7a90: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
7aa0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
7ab0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
7ac0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
7ad0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
7ae0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7af0: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7b00: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7b10: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7b20: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7b30: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7b40: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7b50: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
7b60: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
7b70: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
7b80: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
7b90: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
7ba0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
7bb0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
7bc0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
7bd0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
7be0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7bf0: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7c00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7c10: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7c20: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7c30: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7c40: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7c50: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
7c60: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
7c70: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
7c80: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
7c90: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
7ca0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
7cb0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7cc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7cd0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7ce0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7cf0: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7d00: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7d10: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7d20: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7d30: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7d40: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7d50: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7d60: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7d70: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7d80: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7d90: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7da0: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7db0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7dc0: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7dd0: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7de0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
7df0: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
7e00: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
7e10: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
7e20: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
7e30: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
7e40: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
7e50: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
7e60: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
7e70: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
7e80: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
7e90: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
7ea0: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
7eb0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
7ec0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
7ed0: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
7ee0: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
7ef0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7f00: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
7f10: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
7f20: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
7f30: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
7f40: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
7f50: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
7f60: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
7f70: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
7f80: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
7f90: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
7fa0: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
7fb0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
7fc0: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
7fd0: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
7fe0: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
7ff0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
8000: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
8010: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
8020: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
8030: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
8040: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
8050: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
8060: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
8070: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
8080: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
8090: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
80a0: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
80b0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
80c0: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
80d0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
80e0: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
80f0: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
8100: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
8110: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8120: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
8130: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
8140: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
8150: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8160: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
8170: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
8180: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
8190: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
81a0: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
81b0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
81c0: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
81d0: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
81e0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
81f0: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
8200: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
8210: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
8220: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
8230: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
8240: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
8250: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8260: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8270: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8280: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
8290: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
82a0: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
82b0: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
82c0: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
82d0: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
82e0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
82f0: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8300: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8310: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8320: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8330: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8340: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8350: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8360: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8370: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8380: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
8390: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
83a0: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
83b0: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
83c0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
83d0: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
83e0: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
83f0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8400: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8410: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8420: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8430: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8440: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8450: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8460: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8470: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8480: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
8490: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
84a0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
84b0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
84c0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
84d0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
84e0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
84f0: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8500: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8510: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8520: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8530: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8540: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8550: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8560: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8570: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8580: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
8590: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
85a0: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
85b0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
85c0: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
85d0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
85e0: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
85f0: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8600: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8610: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8620: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8630: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8640: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8650: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8660: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8670: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
8680: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
8690: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
86a0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
86b0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
86c0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
86d0: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
86e0: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
86f0: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8700: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8710: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8720: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8730: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8740: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8750: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
8760: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
8770: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
8780: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
8790: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
87a0: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
87b0: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
87c0: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
87d0: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
87e0: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
87f0: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8800: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8810: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8820: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8830: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8840: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8850: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
8860: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
8870: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
8880: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
8890: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
88a0: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
88b0: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
88c0: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
88d0: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
88e0: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
88f0: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8900: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8910: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8920: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8930: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8940: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8950: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8960: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
8970: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
8980: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
8990: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
89a0: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
89b0: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
89c0: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
89d0: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
89e0: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
89f0: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8a00: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8a10: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8a20: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8a30: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8a40: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8a50: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
8a60: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
8a70: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
8a80: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
8a90: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
8aa0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
8ab0: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
8ac0: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
8ad0: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
8ae0: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8af0: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8b00: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8b10: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8b20: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8b30: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8b40: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8b50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8b60: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
8b70: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
8b80: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
8b90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8ba0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8bb0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
8bc0: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
8bd0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
8be0: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8bf0: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8c00: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8c10: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8c40: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8c50: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
8c60: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
8c70: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
8c80: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
8c90: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
8ca0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
8cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8cc0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8cd0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8ce0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8cf0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8d00: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8d10: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8d20: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8d30: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8d40: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8d50: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8d60: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8d70: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8d80: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8d90: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8da0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8db0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8dc0: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8dd0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8de0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8df0: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
8e00: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
8e10: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
8e20: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
8e30: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8e40: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
8e50: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
8e60: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
8e70: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
8e80: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8e90: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
8ea0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
8eb0: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ed0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
8ee0: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
8ef0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8f00: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
8f10: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
8f20: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
8f30: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
8f40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8f50: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
8f60: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
8f70: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
8f80: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
8f90: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8fb0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8fc0: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
8fd0: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
8fe0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
8ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
9000: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
9010: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
9020: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
9030: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
9040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9050: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
9060: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
9070: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
9080: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
9090: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
90a0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
90b0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
90c0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
90d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
90e0: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
90f0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9100: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
9110: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
9120: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
9130: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
9140: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
9150: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
9160: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
9170: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
9180: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
9190: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
91a0: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
91b0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
91c0: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
91f0: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
9200: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
9210: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
9220: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
9230: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
9240: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
9250: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
9260: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
9280: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
9290: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
92a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
92b0: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
92c0: 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  _x(), is only ev
92d0: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
92e0: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
92f0: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
9300: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
9310: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
9320: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
9330: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
9340: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
9350: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
9360: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
9370: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
9380: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
9390: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
93a0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
93b0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
93c0: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
93d0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
93e0: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
93f0: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
9400: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9410: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
9420: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
9430: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
9440: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
9450: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
9460: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
9470: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
9480: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
9490: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
94a0: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
94b0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
94c0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
94d0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
94e0: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
94f0: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
9500: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
9510: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
9520: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
9530: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
9540: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
9550: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
9560: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
9570: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
9580: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
9590: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
95c0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
95d0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
95e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
95f0: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
9600: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
9610: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9620: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
9630: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
9640: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
9650: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
9660: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
9670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
9680: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
9690: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
96a0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
96b0: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
96d0: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
96e0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
96f0: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
9700: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
9710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
9720: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
9730: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
9740: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
9750: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
9760: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
9770: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
9780: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
9790: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
97a0: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
97b0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
97c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
97d0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
97e0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
97f0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
9800: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
9810: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
9820: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
9830: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
9840: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
9850: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
9860: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
9870: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
9880: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
9890: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
98a0: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
98b0: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
98c0: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
98d0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
98e0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
98f0: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
9900: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
9910: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
9920: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9930: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
9940: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
9950: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
9960: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
9970: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
9980: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
9990: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
99a0: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
99b0: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
99c0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
99d0: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
99e0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
99f0: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
9a00: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
9a10: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
9a20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9a30: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
9a40: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
9a50: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
9a60: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
9a70: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
9a80: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
9a90: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
9aa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
9ab0: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
9ac0: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
9ad0: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
9ae0: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
9af0: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
9b00: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
9b10: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
9b20: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
9b30: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
9b40: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
9b50: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
9b60: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
9b70: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
9b80: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
9b90: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
9ba0: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
9bb0: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
9bc0: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
9bd0: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
9be0: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
9bf0: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
9c00: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
9c10: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
9c20: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
9c30: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
9c40: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
9c50: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
9c60: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
9c70: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
9c80: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
9c90: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
9ca0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
9cb0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
9cc0: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
9cd0: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
9ce0: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
9cf0: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
9d00: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
9d10: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
9d20: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
9d30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
9d40: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
9d50: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
9d60: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
9d70: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
9d80: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
9d90: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
9da0: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
9db0: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
9dc0: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
9dd0: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
9de0: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
9df0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
9e00: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
9e10: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
9e20: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
9e30: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
9e40: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
9e50: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
9e60: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
9e70: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
9e80: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
9e90: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
9ea0: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
9eb0: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
9ec0: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
9ed0: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
9ee0: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
9ef0: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
9f00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
9f10: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
9f20: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
9f30: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
9f40: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
9f50: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
9f60: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
9f70: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
9f80: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
9fa0: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
9fb0: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
9fc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
9fd0: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73  ose all file des
9fe0: 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61  criptors accumua
9ff0: 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49  ted in the unixI
a000: 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65  nodeInfo->pUnuse
a010: 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74  d list..*/ .stat
a020: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e  ic void closePen
a030: 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65  dingFds(unixFile
a040: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
a050: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
a060: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
a070: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
a080: 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73  d *p;.  UnixUnus
a090: 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  edFd *pNext;.  f
a0a0: 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e  or(p=pInode->pUn
a0b0: 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  used; p; p=pNext
a0c0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
a0d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62  ->pNext;.    rob
a0e0: 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
a0f0: 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   p->fd, __LINE__
a100: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
a110: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49  ree(p);.  }.  pI
a120: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
a130: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
a140: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
a150: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
a160: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
a170: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
a180: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
a190: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
a1a0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
a1b0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
a1c0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
a1d0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
a1e0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
a1f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a200: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
a210: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a220: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
a230: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
a240: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
a250: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
a260: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
a270: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
a280: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
a290: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
a2a0: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
a2b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a2c0: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
a2d0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
a2e0: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
a2f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
a300: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
a310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a320: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
a330: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
a340: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
a350: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
a360: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
a370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a380: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
a390: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
a3a0: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
a3b0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
a3c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a3d0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
a3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a3f0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
a400: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
a410: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
a420: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
a430: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
a440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a450: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
a460: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
a470: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
a480: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a490: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
a4a0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a4b0: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
a4c0: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
a4d0: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
a4e0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
a4f0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
a500: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
a510: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
a520: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
a530: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
a540: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
a550: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
a560: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
a570: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
a580: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
a590: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a5a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
a5b0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
a5c0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
a5d0: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
a5e0: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
a5f0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
a600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
a610: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
a620: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
a630: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
a640: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
a650: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
a660: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
a670: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
a680: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
a690: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
a6b0: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
a6c0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
a6f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
a700: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
a710: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
a720: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
a730: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
a740: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
a750: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
a760: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
a770: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
a780: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
a790: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
a7a0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a7b0: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
a7c0: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
a7d0: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
a7e0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
a7f0: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
a800: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
a810: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a820: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
a830: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
a840: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
a850: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
a860: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
a870: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
a880: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
a890: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
a8a0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  c!=0 ){.    pFil
a8b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
a8c0: 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56  rrno;.#ifdef EOV
a8d0: 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70  ERFLOW.    if( p
a8e0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
a8f0: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
a900: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
a910: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
a920: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
a930: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
a940: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
a950: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
a960: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
a970: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
a980: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
a990: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
a9a0: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
a9b0: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
a9c0: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
a9d0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
a9e0: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
a9f0: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
aa00: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
aa10: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
aa20: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
aa30: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
aa40: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
aa50: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
aa60: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
aa70: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
aa80: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
aa90: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
aaa0: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
aab0: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
aac0: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
aad0: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
aae0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
aaf0: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
ab00: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
ab10: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
ab20: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
ab30: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
ab40: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
ab50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
ab60: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
ab70: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
ab80: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
ab90: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
aba0: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
abb0: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
abc0: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
abd0: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
abe0: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
abf0: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
ac00: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
ac10: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
ac20: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
ac30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
ac40: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
ac50: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
ac60: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
ac70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
ac80: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
ac90: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
aca0: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
acb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
acc0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
acd0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
ace0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
acf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
ad00: 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  f..  memset(&fil
ad10: 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  eId, 0, sizeof(f
ad20: 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49  ileId));.  fileI
ad30: 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  d.dev = statbuf.
ad40: 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56  st_dev;.#if OS_V
ad50: 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e  XWORKS.  fileId.
ad60: 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64  pId = pFile->pId
ad70: 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64  ;.#else.  fileId
ad80: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
ad90: 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20  t_ino;.#endif.  
ada0: 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
adb0: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  st;.  while( pIn
adc0: 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66  ode && memcmp(&f
add0: 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e  ileId, &pInode->
ade0: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
adf0: 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70  ileId)) ){.    p
ae00: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
ae10: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
ae20: 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20   pInode==0 ){.  
ae30: 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74    pInode = sqlit
ae40: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
ae50: 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20  f(*pInode) );.  
ae60: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
ae70: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ae80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ae90: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
aea0: 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Inode, 0, sizeof
aeb0: 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20  (*pInode));.    
aec0: 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e  memcpy(&pInode->
aed0: 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c  fileId, &fileId,
aee0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
aef0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  ;.    pInode->nR
af00: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f  ef = 1;.    pIno
af10: 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64  de->pNext = inod
af20: 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64  eList;.    pInod
af30: 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  e->pPrev = 0;.  
af40: 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20    if( inodeList 
af50: 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72  ) inodeList->pPr
af60: 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20  ev = pInode;.   
af70: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
af80: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
af90: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b    pInode->nRef++
afa0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65  ;.  }.  *ppInode
afb0: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74   = pInode;.  ret
afc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
afe0: 52 55 45 20 69 66 20 70 46 69 6c 65 20 68 61 73  RUE if pFile has
aff0: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
b000: 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20   unlinked since 
b010: 69 74 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  it was first ope
b020: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
b030: 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28  nt fileHasMoved(
b040: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
b050: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
b060: 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  buf;.  return pF
b070: 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26  ile->pInode!=0 &
b080: 26 0a 20 20 20 20 20 20 20 20 20 28 6f 73 53 74  &.         (osSt
b090: 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  at(pFile->zPath,
b0a0: 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62 75 66   &buf)!=0 || buf
b0b0: 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e  .st_ino!=pFile->
b0c0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
b0d0: 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  no);.}.../*.** C
b0e0: 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c 65 20  heck a unixFile 
b0f0: 74 68 61 74 20 69 73 20 61 20 64 61 74 61 62 61  that is a databa
b100: 73 65 2e 20 20 56 65 72 69 66 79 20 74 68 65 20  se.  Verify the 
b110: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
b120: 20 28 31 29 20 54 68 65 72 65 20 69 73 20 65 78   (1) There is ex
b130: 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c  actly one hard l
b140: 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ink on the file.
b150: 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c 65 20  ** (2) The file 
b160: 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69  is not a symboli
b170: 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68  c link.** (3) Th
b180: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
b190: 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75  een renamed or u
b1a0: 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73  nlinked.**.** Is
b1b0: 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  sue sqlite3_log(
b1c0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e  SQLITE_WARNING,.
b1d0: 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69 66 20  ..) messages if 
b1e0: 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f 74 20  anything is not 
b1f0: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
b200: 20 76 6f 69 64 20 76 65 72 69 66 79 44 62 46 69   void verifyDbFi
b210: 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  le(unixFile *pFi
b220: 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74  le){.  struct st
b230: 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20 72 63  at buf;.  int rc
b240: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  ;.  if( pFile->c
b250: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
b260: 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b 0a 20 20  ILE_WARNED ){.  
b270: 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65    /* One or more
b280: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b290: 67 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65 20  g warnings have 
b2a0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 73 73  already been iss
b2b0: 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 20  ued.  Do not.   
b2c0: 20 2a 2a 20 72 65 70 65 61 74 20 74 68 65 6d 20   ** repeat them 
b2d0: 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63 6c 75  so as not to clu
b2e0: 74 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 6c  tter the error l
b2f0: 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  og */.    return
b300: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6f 73 46  ;.  }.  rc = osF
b310: 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
b320: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
b330: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b340: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
b350: 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74  ING, "cannot fst
b360: 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20  at db file %s", 
b370: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
b380: 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
b390: 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
b3a0: 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75  WARNED;.    retu
b3b0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75  rn;.  }.  if( bu
b3c0: 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26  f.st_nlink==0 &&
b3d0: 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
b3e0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
b3f0: 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
b400: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b410: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
b420: 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65  e unlinked while
b430: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
b440: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b450: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b460: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b470: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b480: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b490: 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20  _nlink>1 ){.    
b4a0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b4b0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c  TE_WARNING, "mul
b4c0: 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66  tiple links to f
b4d0: 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d  ile: %s", pFile-
b4e0: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
b4f0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
b500: 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44   UNIXFILE_WARNED
b510: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b520: 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d  }.  if( fileHasM
b530: 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20  oved(pFile) ){. 
b540: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b550: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
b560: 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69  file renamed whi
b570: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
b580: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
b590: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
b5a0: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
b5b0: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
b5c0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
b5d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
b5e0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
b5f0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
b600: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
b610: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
b620: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
b630: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
b640: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
b650: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
b660: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
b670: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
b680: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
b690: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
b6a0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
b6b0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
b6c0: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
b6d0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
b6e0: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
b6f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
b700: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
b710: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
b720: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
b730: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
b740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b750: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
b760: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
b770: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
b780: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
b790: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
b7a0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
b7b0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b7c0: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
b7d0: 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45  pFile );.  unixE
b7e0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
b7f0: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
b800: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
b810: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
b820: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
b830: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
b840: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
b850: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
b860: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
b870: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
b880: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
b890: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
b8a0: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
b8b0: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
b8c0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
b8d0: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
b8e0: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
b8f0: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26  if( !reserved &&
b900: 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d   !pFile->pInode-
b910: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
b920: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
b930: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
b940: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b950: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
b960: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
b970: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
b980: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
b990: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
b9a0: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f  WRLCK;.    if( o
b9b0: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
b9c0: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
b9d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
b9e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
b9f0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
ba00: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ba10: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ba20: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
ba30: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
ba40: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
ba50: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
ba60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
ba70: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
ba80: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
ba90: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
baa0: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
bab0: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
bac0: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
bad0: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
bae0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
baf0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
bb00: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
bb10: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
bb20: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
bb30: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
bb40: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
bb50: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
bb60: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
bb70: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
bb80: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
bb90: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
bba0: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
bbb0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
bbc0: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
bbd0: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
bbe0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
bbf0: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
bc00: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
bc10: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
bc20: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
bc30: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
bc40: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
bc50: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
bc60: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
bc70: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
bc80: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
bc90: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
bca0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
bcb0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
bcc0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
bcd0: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
bce0: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
bcf0: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
bd00: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
bd10: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
bd20: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
bd30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bd40: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
bd50: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
bd60: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
bd70: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
bd80: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
bd90: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
bda0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
bdb0: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
bdc0: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
bdd0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
bde0: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
bdf0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
be00: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
be10: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
be20: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
be30: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
be40: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
be50: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
be60: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
be70: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
be80: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
be90: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
bea0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
beb0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
bec0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
bed0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
bee0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
bef0: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
bf00: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
bf10: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
bf20: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
bf30: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
bf40: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bf50: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
bf60: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bf70: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
bf80: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
bf90: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
bfa0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
bfb0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
bfc0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
bfd0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
bfe0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
bff0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
c000: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
c010: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
c020: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
c030: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
c040: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
c050: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
c060: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
c070: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
c080: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
c090: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
c0a0: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
c0b0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
c0c0: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
c0d0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
c0e0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
c0f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
c100: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c110: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
c120: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c130: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
c140: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c150: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
c160: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
c170: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
c180: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
c190: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
c1a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c1b0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
c1c0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
c1d0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
c1e0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
c1f0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
c200: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
c210: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
c220: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
c230: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
c240: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
c250: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
c260: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
c270: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
c280: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
c290: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
c2a0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
c2b0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
c2c0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
c2d0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
c2e0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
c2f0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
c300: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
c310: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
c320: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
c330: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
c340: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
c350: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
c360: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
c370: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
c380: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
c390: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
c3a0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
c3b0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c3c0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
c3d0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c3e0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
c3f0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
c400: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
c410: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
c420: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
c430: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c440: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
c450: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
c460: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
c470: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c480: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
c490: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
c4a0: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
c4b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
c4c0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
c4d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c4e0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
c4f0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
c500: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
c510: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
c520: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
c530: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
c540: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
c550: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
c560: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
c570: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
c580: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
c590: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
c5a0: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
c5b0: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
c5c0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
c5d0: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
c5e0: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
c5f0: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
c600: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
c610: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
c620: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
c630: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
c640: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
c650: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
c660: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
c670: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
c680: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
c690: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
c6a0: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
c6b0: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
c6c0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
c6d0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c6e0: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
c6f0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c700: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
c710: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
c720: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c730: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
c740: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
c750: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
c760: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
c770: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
c780: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
c790: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
c7a0: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
c7b0: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
c7c0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c7d0: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
c7e0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
c7f0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c800: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
c810: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
c820: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
c830: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c840: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
c850: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
c860: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
c870: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c880: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
c890: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c8a0: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
c8b0: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
c8c0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c8d0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
c8e0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
c8f0: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
c900: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
c910: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
c920: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c930: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c940: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
c950: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
c960: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
c970: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
c980: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
c990: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
c9a0: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
c9b0: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
c9c0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
c9d0: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
c9e0: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
c9f0: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
ca00: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
ca10: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
ca20: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
ca30: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
ca40: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
ca50: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
ca60: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
ca70: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
ca80: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
ca90: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
caa0: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
cab0: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
cac0: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
cad0: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
cae0: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
caf0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
cb00: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
cb10: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
cb20: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
cb30: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
cb40: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
cb50: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
cb60: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
cb70: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
cb80: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
cb90: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
cba0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
cbb0: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
cbc0: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
cbd0: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
cbe0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
cbf0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
cc00: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
cc10: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
cc20: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
cc30: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
cc40: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
cc50: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
cc60: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
cc70: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
cc80: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
cc90: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
cca0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
ccb0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
ccc0: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
ccd0: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
cce0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
ccf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
cd00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cd10: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
cd20: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
cd30: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
cd40: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
cd50: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
cd60: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cd70: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
cd80: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
cd90: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
cda0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
cdb0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
cdc0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
cdd0: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
cde0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
cdf0: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
ce00: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
ce10: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
ce20: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
ce30: 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
ce40: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
ce50: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
ce60: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
ce70: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
ce80: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
ce90: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
cea0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
ceb0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
cec0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
ced0: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
cee0: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
cef0: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
cf00: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
cf10: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
cf20: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
cf30: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
cf40: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
cf50: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
cf60: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
cf70: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
cf80: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
cf90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cfa0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
cfb0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
cfc0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
cfd0: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
cfe0: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
cff0: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
d000: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
d010: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
d020: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
d030: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
d040: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
d050: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
d060: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
d070: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
d080: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
d090: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
d0a0: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
d0b0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d0c0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
d0d0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
d0e0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
d0f0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
d100: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
d110: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d120: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
d130: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
d140: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d150: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
d160: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
d170: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
d180: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
d190: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
d1a0: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
d1b0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
d1c0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d1d0: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
d1e0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
d1f0: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
d200: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
d210: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
d220: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
d230: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
d240: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
d250: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
d260: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
d270: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
d280: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
d290: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
d2a0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
d2b0: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
d2c0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
d2d0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
d2e0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
d2f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
d300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
d310: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
d320: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
d330: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
d340: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
d350: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
d360: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
d370: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
d380: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
d390: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
d3a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d3b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
d3c0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d3d0: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
d3e0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d3f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
d400: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d410: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
d420: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
d430: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
d440: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
d450: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
d460: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
d470: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
d480: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
d490: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
d4a0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
d4b0: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
d4c0: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
d4d0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
d4e0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
d4f0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
d500: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
d510: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
d520: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
d530: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
d540: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
d550: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
d560: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
d570: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
d580: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
d590: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
d5a0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
d5b0: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
d5c0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
d5d0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
d5e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
d5f0: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
d600: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
d610: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
d620: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
d630: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
d640: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
d650: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d660: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
d670: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
d680: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
d690: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
d6a0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
d6b0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
d6c0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
d6d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d6e0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
d6f0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
d700: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
d710: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d720: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
d730: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
d740: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
d750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d760: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
d770: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
d780: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
d790: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
d7a0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
d7b0: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
d7c0: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
d7d0: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
d7e0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
d7f0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
d800: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d810: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
d820: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
d830: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
d840: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
d850: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
d860: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
d870: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
d880: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
d890: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
d8a0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
d8b0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
d8c0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
d8d0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
d8e0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
d8f0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
d900: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
d910: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
d920: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
d930: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
d940: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
d950: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  _LOCK);.    }.. 
d960: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
d970: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
d980: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
d990: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
d9a0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
d9b0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
d9c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d9d0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
d9e0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
d9f0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20  File, &lock) && 
da00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
da10: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
da20: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
da30: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
da40: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
da50: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
da60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
da70: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d  R_UNLOCK; .    }
da80: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
da90: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
daa0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
dab0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
dac0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
dae0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
daf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
db00: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
db10: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
db20: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
db30: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
db40: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
db50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
db60: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
db70: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
db80: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
db90: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
dba0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
dbb0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
dbc0: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
dbd0: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
dbe0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
dbf0: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
dc00: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
dc10: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
dc20: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
dc30: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
dc40: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
dc50: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
dc60: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
dc70: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
dc80: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
dc90: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
dca0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
dcb0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
dcc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
dcd0: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
dce0: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
dcf0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
dd00: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
dd10: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
dd20: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
dd30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
dd40: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
dd50: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
dd60: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
dd70: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
dd80: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
dd90: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
dda0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
ddb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
ddc0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ddd0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dde0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
ddf0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
de00: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
de10: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
de20: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
de30: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
de40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
de50: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
de60: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
de70: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
de80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
de90: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
dea0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
deb0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
dec0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ded0: 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54    ..#ifdef SQLIT
dee0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74  E_DEBUG.  /* Set
def0: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
df00: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
df10: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
df20: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
df30: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
df40: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
df50: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
df60: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
df70: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
df80: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
df90: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
dfa0: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
dfb0: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
dfc0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
dfd0: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
dfe0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dff0: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
e000: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
e010: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
e020: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
e030: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
e040: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
e050: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
e060: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
e070: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
e080: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
e090: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
e0a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e0b0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
e0c0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e0d0: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
e0e0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
e0f0: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
e100: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
e110: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
e120: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e130: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
e140: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
e150: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
e160: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
e170: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
e180: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
e190: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
e1a0: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
e1b0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
e1c0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
e1d0: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
e1e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
e1f0: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
e200: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e210: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
e220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
e230: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
e240: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
e250: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
e260: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
e270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
e280: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
e290: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
e2a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
e2b0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
e2c0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
e2d0: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
e2e0: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
e2f0: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
e300: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
e310: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
e320: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
e330: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
e340: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
e350: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e360: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e370: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e380: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e390: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e3a0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e3b0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e3c0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e3d0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e3e0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e3f0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e400: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e410: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e420: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e430: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e440: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
e450: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
e460: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
e470: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
e480: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
e490: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
e4a0: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
e4b0: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
e4c0: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
e4d0: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
e4e0: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
e4f0: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
e500: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
e510: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
e520: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
e530: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
e540: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
e550: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
e560: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
e570: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
e580: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
e590: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
e5a0: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
e5b0: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
e5c0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
e5d0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
e5e0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
e5f0: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
e600: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
e610: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e620: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e630: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
e640: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
e650: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
e660: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e670: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
e680: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
e690: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
e6a0: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
e6b0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
e6c0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
e6d0: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
e6e0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
e6f0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
e700: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
e710: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
e720: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
e730: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
e740: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
e750: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
e760: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
e770: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
e780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e790: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
e7a0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
e7b0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
e7c0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
e7d0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
e7e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
e7f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
e800: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
e810: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
e820: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
e830: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23  >eFileLock );..#
e840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
e850: 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
e860: 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
e870: 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
e880: 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
e890: 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
e8a0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
e8b0: 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
e8c0: 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
e8d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
e8e0: 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
e8f0: 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
e900: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
e910: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
e920: 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
e930: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
e940: 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
e950: 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
e960: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
e970: 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
e980: 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
e990: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
e9a0: 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
e9b0: 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
e9c0: 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
e9d0: 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
e9e0: 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
e9f0: 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
ea00: 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
ea10: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
ea20: 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65      */.    pFile
ea30: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
ea40: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
ea50: 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
ea60: 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
ea70: 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
ea80: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
ea90: 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
eaa0: 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
eab0: 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
eac0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
ead0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
eae0: 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
eaf0: 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
eb00: 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
eb10: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
eb20: 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
eb30: 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
eb40: 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
eb50: 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
eb60: 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
eb70: 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
eb80: 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
eb90: 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
eba0: 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
ebb0: 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
ebc0: 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
ebd0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
ebe0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ebf0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
ec00: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c  APPLE__) || !SQL
ec10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
ec20: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28  NG_STYLE.      (
ec30: 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e  void)handleNFSUn
ec40: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
ec50: 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  rt( handleNFSUnl
ec60: 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  ock==0 );.#endif
ec70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
ec80: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
ec90: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
eca0: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
ecb0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
ecc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
ecd0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
ece0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
ecf0: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
ed00: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  call errors */. 
ed10: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76         off_t div
ed20: 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49  Size = SHARED_SI
ed30: 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ZE - 1;.        
ed40: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
ed50: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
ed60: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
ed70: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ed80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ed90: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
eda0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
edb0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
edc0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
edd0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ede0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
edf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
ee00: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ee10: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
ee20: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
ee30: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
ee40: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ee50: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
ee60: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ee70: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
ee80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ee90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
eea0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
eeb0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
eec0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
eed0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
eee0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
eef0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
ef00: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
ef10: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
ef20: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
ef30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
ef40: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
ef50: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
ef60: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
ef70: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
ef80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ef90: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
efa0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
efb0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
efc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
efd0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
efe0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
eff0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
f000: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
f010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f020: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
f030: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
f040: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f050: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f060: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f070: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f080: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f090: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f0a0: 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
f0b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f0c0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
f0d0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
f0e0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f0f0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
f100: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
f110: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f120: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f130: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f140: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  CK;.          if
f150: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f160: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
f170: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f180: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
f190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f1a0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f1b0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f1c0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
f1d0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
f1e0: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
f1f0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f200: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
f210: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
f220: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
f230: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f240: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f250: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f260: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f270: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
f280: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
f290: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
f2a0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f2b0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
f2d0: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
f2e0: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
f2f0: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
f300: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
f310: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
f320: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
f330: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
f340: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
f350: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
f360: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
f370: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
f380: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
f390: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
f3a0: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
f3b0: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
f3c0: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
f3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f3e0: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
f3f0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
f400: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
f410: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
f420: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
f430: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
f440: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f450: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
f460: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
f470: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f480: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
f490: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f4a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f4b0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f4c0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f4d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f4e0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
f4f0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f500: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f510: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f520: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
f530: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
f540: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
f550: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
f560: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
f570: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
f580: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f590: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f5a0: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
f5b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
f5c0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
f5d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
f5e0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f5f0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  NLOCK;.      pFi
f600: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f610: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74  errno;.      got
f620: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f630: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
f640: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
f650: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
f660: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
f670: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
f680: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
f690: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
f6a0: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
f6b0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
f6c0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
f6d0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
f6e0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
f6f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
f700: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
f710: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
f720: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
f730: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f740: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
f750: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f760: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f770: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f780: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
f790: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
f7a0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f7b0: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
f7c0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
f7d0: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
f7e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f7f0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f800: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
f810: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
f820: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
f830: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
f840: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
f850: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
f860: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f870: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
f880: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
f890: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63   Decrement the c
f8a0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67  ount of locks ag
f8b0: 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20  ainst this same 
f8c0: 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a  file.  When the.
f8d0: 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61      ** count rea
f8e0: 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65  ches zero, close
f8f0: 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20   any other file 
f900: 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73  descriptors whos
f910: 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77  e close.    ** w
f920: 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61  as deferred beca
f930: 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  use of outstandi
f940: 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f  ng locks..    */
f950: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
f960: 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ck--;.    assert
f970: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
f980: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
f990: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
f9a0: 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  {.      closePen
f9b0: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
f9c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75      }.  }..end_u
f9d0: 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  nlock:.  unixLea
f9e0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
f9f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fa00: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
fa10: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
fa20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fa30: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
fa40: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
fa50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
fa60: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
fa70: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
fa80: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
fa90: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
faa0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
fab0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
fac0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
fad0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
fae0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
faf0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
fb00: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
fb10: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
fb20: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
fb30: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
fb40: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
fb50: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
fb60: 6f 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  ock){.#if SQLITE
fb70: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
fb80: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
fb90: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
fba0: 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20  K || ((unixFile 
fbb0: 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74  *)id)->nFetchOut
fbc0: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
fbd0: 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
fbe0: 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
fbf0: 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  , 0);.}..#if SQL
fc00: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
fc10: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75  E>0.static int u
fc20: 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46  nixMapfile(unixF
fc30: 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42  ile *pFd, i64 nB
fc40: 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  yte);.static voi
fc50: 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
fc60: 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a  unixFile *pFd);.
fc70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
fc80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66  is function perf
fc90: 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f  orms the parts o
fca0: 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c  f the "close fil
fcb0: 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a  e" operation .**
fcc0: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
fcd0: 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20  ocking schemes. 
fce0: 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69  It closes the di
fcf0: 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65  rectory and file
fd00: 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20  .** handles, if 
fd10: 74 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20  they are valid, 
fd20: 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65  and sets all fie
fd30: 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  lds of the unixF
fd40: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
fd50: 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20   to 0..**.** It 
fd60: 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61  is *not* necessa
fd70: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ry to hold the m
fd80: 75 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72  utex when this r
fd90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
fda0: 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57  ,.** even on VxW
fdb0: 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77  orks.  A mutex w
fdc0: 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20  ill be acquired 
fdd0: 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68  on VxWorks by th
fde0: 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65  e.** vxworksRele
fdf0: 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74  aseFileId() rout
fe00: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
fe10: 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  nt closeUnixFile
fe20: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fe30: 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
fe40: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
fe50: 65 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54  e*)id;.#if SQLIT
fe60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
fe70: 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  0.  unixUnmapfil
fe80: 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66  e(pFile);.#endif
fe90: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e  .  if( pFile->h>
fea0: 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74  =0 ){.    robust
feb0: 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46  _close(pFile, pF
fec0: 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
fed0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  );.    pFile->h 
fee0: 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53  = -1;.  }.#if OS
fef0: 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70  _VXWORKS.  if( p
ff00: 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
ff10: 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
ff20: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
ff30: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20  _DELETE ){.     
ff40: 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   osUnlink(pFile-
ff50: 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
ff60: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
ff70: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
ff80: 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64  ileId(pFile->pId
ff90: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49  );.    pFile->pI
ffa0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
ffb0: 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
ffc0: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
ffd0: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
ffe0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
fff0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
10000 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  le->pUnused);.  
10010 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
10020 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
10030 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
10040 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10050 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
10060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
10070 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
10080 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
10090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
100a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
100b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
100c0 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69  id;.  verifyDbFi
100d0 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69  le(pFile);.  uni
100e0 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
100f0 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  OCK);.  unixEnte
10100 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
10110 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20  unixFile.pInode 
10120 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
10130 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  here. Otherwise,
10140 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f   a different clo
10150 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  se.  ** routine 
10160 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  (e.g. nolockClos
10170 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61  e()) would be ca
10180 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  lled instead..  
10190 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
101a0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
101b0 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49  k>0 || pFile->pI
101c0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
101d0 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41  ck==0 );.  if( A
101e0 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e  LWAYS(pFile->pIn
101f0 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70  ode) && pFile->p
10200 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
10210 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10220 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
10230 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
10240 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
10250 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
10260 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
10270 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
10280 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
10290 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
102a0 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
102b0 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
102c0 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
102d0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
102e0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
102f0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
10300 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
10310 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
10320 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
10330 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ile);.  }.  rele
10340 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
10350 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  le);.  rc = clos
10360 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10370 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
10380 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10390 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
103a0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
103b0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
103c0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
103d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
103e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104a0 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
104b0 20 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 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
104e0 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
104f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
10500 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
10510 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
10520 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
10530 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
10540 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
10550 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
10560 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
10570 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
10580 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
10590 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
105a0 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
105b0 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
105c0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
105d0 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
105e0 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
105f0 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
10600 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
10610 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
10620 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
10630 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
10640 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
10650 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
10660 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
10670 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
10680 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
10690 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
106a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
106b0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
106c0 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
106d0 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
106e0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
106f0 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
10700 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
10710 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
10720 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
10730 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
10740 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
10750 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
10760 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
10770 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
10780 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
10790 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
107a0 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
107b0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
107c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
107d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
107e0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52  NotUsed, int *pR
107f0 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
10800 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
10810 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
10820 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
10830 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
10840 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
10850 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
10860 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
10870 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
10880 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
10890 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
108a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
108b0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
108c0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
108d0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
108e0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
108f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10900 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10910 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10930 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
10940 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
10950 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
10960 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10970 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
10980 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10990 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
109b0 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
109c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a30 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
10a40 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
10aa0 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
10ab0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
10ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ad0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
10ae0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
10af0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
10b00 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e 63  ses the existenc
10b10 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  e of separate lo
10b20 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61  ck.** files (rea
10b30 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29  lly a directory)
10b40 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
10b50 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
10b60 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a  se.  This works.
10b70 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74  ** on just about
10b80 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
10b90 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
10ba0 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
10bb0 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
10bc0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
10bd0 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
10be0 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
10bf0 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
10c00 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
10c10 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
10c20 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
10c30 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
10c40 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
10c50 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
10c60 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
10c70 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
10c80 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
10c90 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
10ca0 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
10cb0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
10cc0 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
10cd0 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
10ce0 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
10cf0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
10d00 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
10d10 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
10d20 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
10d30 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
10d40 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
10d50 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
10d60 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62  y creating a sub
10d70 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65  directory in the
10d80 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
10d90 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  as.** the databa
10da0 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
10db0 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
10dc0 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
10dd0 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
10de0 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   The existence o
10df0 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  f a lock directo
10e00 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  ry implies an EX
10e10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
10e20 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b  ll other.** lock
10e30 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
10e40 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
10e50 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
10e60 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
10e70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
10e80 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
10e90 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
10ea0 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
10eb0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
10ec0 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  * lock directory
10ed0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54  ..*/.#define DOT
10ee0 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f  LOCK_SUFFIX ".lo
10ef0 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ck"../*.** This 
10f00 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
10f10 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
10f20 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
10f30 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
10f40 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
10f50 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
10f60 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
10f70 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
10f80 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
10f90 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
10fa0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
10fb0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
10fc0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
10fd0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
10fe0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
10ff0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
11000 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11010 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
11020 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65  **.** In dotfile
11030 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72   locking, either
11040 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f   a lock exists o
11050 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20  r it does not.  
11060 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61  So in this.** va
11070 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b  riation of Check
11080 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20  ReservedLock(), 
11090 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
110a0 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c  to true if any l
110b0 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f  ock.** is held o
110c0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66  n the file and f
110d0 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65  alse if the file
110e0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f   is unlocked..*/
110f0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11100 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
11110 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11120 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11130 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
11140 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11150 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
11160 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11170 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11180 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
11190 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
111a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
111b0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
111c0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
111d0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
111e0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
111f0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
11200 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
11210 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
11220 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
11230 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  ED_LOCK ){.    /
11240 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63 6f  * Either this co
11250 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65  nnection or some
11260 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
11270 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  n in the same pr
11280 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c  ocess.    ** hol
11290 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ds a lock on the
112a0 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20   file.  No need 
112b0 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65 72  to check further
112c0 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65  . */.    reserve
112d0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
112e0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20      /* The lock 
112f0 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f  is held if and o
11300 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66  nly if the lockf
11310 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
11320 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
11330 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74  ockFile = (const
11340 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
11350 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
11360 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41    reserved = osA
11370 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  ccess(zLockFile,
11380 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53   0)==0;.  }.  OS
11390 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
113a0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64  LOCK %d %d %d (d
113b0 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  otlock)\n", pFil
113c0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
113d0 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  ed));.  *pResOut
113e0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
113f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11400 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11410 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11420 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11430 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11440 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
11450 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
11460 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
11470 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
11480 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
11490 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
114a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
114b0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
114c0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
114d0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
114e0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
114f0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11500 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11510 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11520 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11530 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11540 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
11550 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
11560 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
11570 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
11580 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
11590 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
115a0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
115b0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
115c0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
115d0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
115e0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
115f0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11600 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11610 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11620 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11630 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11640 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11650 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11660 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11670 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
11680 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11690 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
116a0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
116b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
116c0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
116d0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
116e0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
116f0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
11700 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
11710 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a  ocking level..**
11720 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65  .** With dotfile
11730 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61   locking, we rea
11740 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  lly only support
11750 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c   state (4): EXCL
11760 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65  USIVE..** But we
11770 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72   track the other
11780 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
11790 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73  internally..*/.s
117a0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
117b0 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
117c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
117d0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
117e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
117f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
11800 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
11810 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
11820 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
11830 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11840 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  _OK;...  /* If w
11850 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c  e have any lock,
11860 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66   then the lock f
11870 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ile already exis
11880 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ts.  All we have
11890 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61  .  ** to do is a
118a0 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e  djust our intern
118b0 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
118c0 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a   lock level..  *
118d0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
118e0 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
118f0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
11900 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11910 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41  leLock;.    /* A
11920 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65  lways update the
11930 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68   timestamp on th
11940 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69  e old file */.#i
11950 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a  fdef HAVE_UTIME.
11960 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46      utime(zLockF
11970 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73  ile, NULL);.#els
11980 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f  e.    utimes(zLo
11990 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
119a0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
119b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
119c0 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
119d0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
119e0 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72  /.  rc = osMkdir
119f0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37  (zLockFile, 0777
11a00 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b  );.  if( rc<0 ){
11a10 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74  .    /* failed t
11a20 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
11a30 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  e lock directory
11a40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
11a50 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
11a60 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
11a70 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
11a80 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
11a90 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
11aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
11ab0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11ac0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
11ad0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
11ae0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11af0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
11b00 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11b10 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11b40 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74   .  .  /* got it
11b50 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
11b60 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
11b70 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11b80 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11ba0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
11bb0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
11bc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11bd0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
11be0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
11bf0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
11c00 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
11c10 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
11c20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
11c30 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
11c40 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
11c50 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
11c60 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
11c70 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
11c80 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
11c90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
11ca0 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69  * When the locki
11cb0 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73  ng level reaches
11cc0 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65   NO_LOCK, delete
11cd0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a   the lock file..
11ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11cf0 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  tlockUnlock(sqli
11d00 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11d10 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
11d20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11d30 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11d40 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
11d50 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
11d60 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
11d70 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ext;.  int rc;..
11d80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11d90 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
11da0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
11db0 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c   %d pid=%d (dotl
11dc0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11dd0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
11de0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
11df0 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
11e00 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
11e10 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
11e20 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
11e30 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
11e40 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
11e50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
11e60 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
11e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11e80 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20  K;.  }..  /* To 
11e90 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61  downgrade to sha
11ea0 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61  red, simply upda
11eb0 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
11ec0 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  notion of the.  
11ed0 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20  ** lock state.  
11ee0 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20  No need to mess 
11ef0 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e  with the file on
11f00 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   disk..  */.  if
11f10 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
11f20 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
11f30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11f40 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
11f50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11f60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11f70 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63  * To fully unloc
11f80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
11f90 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
11fa0 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  file */.  assert
11fb0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
11fc0 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f  LOCK );.  rc = o
11fd0 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sRmdir(zLockFile
11fe0 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  );.  if( rc<0 &&
11ff0 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20   errno==ENOTDIR 
12000 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28  ) rc = osUnlink(
12010 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
12020 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e  ( rc<0 ){.    in
12030 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
12040 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  ;.    rc = 0;.  
12050 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
12060 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
12070 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12080 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  R_UNLOCK;.    }.
12090 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
120a0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
120b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
120c0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
120d0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
120e0 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
120f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
12100 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
12110 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12120 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
12130 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
12140 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65  lock has been re
12150 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c  leased before cl
12160 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  osing..*/.static
12170 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73   int dotlockClos
12180 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
12190 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
121a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
121b0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
121c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
121d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
121e0 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69   dotlockUnlock(i
121f0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
12200 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
12210 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
12220 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
12230 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
12240 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12250 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}./**********
12260 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
12270 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  the dot-file loc
12280 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
12290 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
122a0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
122b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122f0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
12300 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12360 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63   Begin flock Loc
12370 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20  *****.**.** Use 
123a0 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74  the flock() syst
123b0 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69  em call to do fi
123c0 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  le locking..**.*
123d0 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  * flock() lockin
123e0 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69  g is like dot-fi
123f0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  le locking in th
12400 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  at the various.*
12410 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63  * fine-grain loc
12420 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70  king levels supp
12430 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  orted by SQLite 
12440 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e  are collapsed in
12450 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65  to.** a single e
12460 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
12470 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12480 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
12490 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47  , and.** PENDING
124a0 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73   locks are the s
124b0 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20  ame thing as an 
124c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
124d0 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c   SQLite.** still
124e0 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20   works when you 
124f0 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e  do this, but con
12500 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75  currency is redu
12510 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c  ced since.** onl
12520 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12530 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ss can be readin
12540 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  g the database a
12550 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  t a time..**.** 
12560 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f  Omit this sectio
12570 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  n if SQLITE_ENAB
12580 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12590 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   is turned off o
125a0 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e  r if.** compilin
125b0 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a  g for VXWORKS..*
125c0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
125d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
125e0 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
125f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c  ../*.** Retry fl
12600 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ock() calls that
12610 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52   fail with EINTR
12620 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52  .*/.#ifdef EINTR
12630 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
12640 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c  st_flock(int fd,
12650 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20   int op){.  int 
12660 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66  rc;.  do{ rc = f
12670 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68  lock(fd,op); }wh
12680 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
12690 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
126a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
126b0 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73  e.# define robus
126c0 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f  t_flock(a,b) flo
126d0 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20  ck(a,b).#endif. 
126e0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
126f0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
12700 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
12710 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
12720 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
12730 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
12740 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
12750 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
12760 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
12770 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
12780 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
12790 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
127a0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
127b0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
127c0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
127d0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
127e0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
127f0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
12800 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
12810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12820 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
12830 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
12840 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
12850 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
12860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12870 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
12880 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12890 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
128a0 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
128b0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
128c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
128d0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
128e0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
128f0 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f   pFile );.  .  /
12900 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
12910 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
12920 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
12930 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
12940 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
12950 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
12960 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
12970 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
12980 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
12990 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
129a0 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
129b0 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
129c0 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20  .    /* attempt 
129d0 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
129e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
129f0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
12a00 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
12a10 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20  | LOCK_NB);.    
12a20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20  if( !lrc ){.    
12a30 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63    /* got the loc
12a40 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a  k, unlock it */.
12a50 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75        lrc = robu
12a60 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
12a70 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20  h, LOCK_UN);.   
12a80 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a     if ( lrc ) {.
12a90 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
12aa0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12ab0 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61      /* unlock fa
12ac0 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  iled with an err
12ad0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72  or */.        lr
12ae0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12af0 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20  _UNLOCK; .      
12b00 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
12b10 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
12b20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
12b30 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
12b40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12b50 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lrc;.        }. 
12b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
12b70 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  e {.      int tE
12b80 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12b90 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12ba0 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f  ;.      /* someo
12bb0 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
12bc0 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
12bd0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71  /.      lrc = sq
12be0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12bf0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12c00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
12c10 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49  K); .      if( I
12c20 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
12c30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
12c40 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12c50 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
12c60 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
12c80 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12c90 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66  LOCK %d %d %d (f
12ca0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12cb0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
12cc0 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ));..#ifdef SQLI
12cd0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12ce0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
12cf0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
12d00 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
12d10 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
12d20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12d30 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d   reserved=1;.  }
12d40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12d50 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12d60 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12d70 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12d80 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12da0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12db0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12dc0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12dd0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12de0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12df0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12e00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12e10 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12e20 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
12e30 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
12e40 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
12e50 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
12e60 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
12e70 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
12e80 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
12e90 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
12ea0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
12eb0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12ec0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12ed0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12ee0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12ef0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12f00 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12f10 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12f20 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
12f30 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
12f40 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
12f50 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
12f60 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
12f70 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
12f80 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
12f90 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
12fa0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
12fb0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
12fc0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
12fd0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
12fe0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
12ff0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
13000 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
13010 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13020 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13030 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
13040 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c  CLUSIVE.**.** fl
13050 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c  ock() only reall
13060 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
13070 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
13080 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
13090 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
130a0 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
130b0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
130c0 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
130d0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
130e0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
130f0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
13100 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
13110 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
13120 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
13130 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
13140 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
13150 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
13160 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
13170 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
13180 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
13190 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
131a0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
131b0 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74   flockLock(sqlit
131c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
131d0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
131e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
131f0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
13200 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13210 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
13220 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
13230 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
13240 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
13250 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
13260 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
13270 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
13280 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
13290 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
132a0 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
132b0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
132c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
132d0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
132e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
132f0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
13300 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
13310 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75  */.  .  if (robu
13320 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
13330 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
13340 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
13350 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13360 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
13370 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
13380 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13390 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
133a0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
133b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
133c0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
133d0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
133e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
133f0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
13400 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
13410 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
13420 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13430 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13440 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13450 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13460 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13470 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
13480 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
13490 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
134a0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
134b0 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
134c0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
134d0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
134e0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
134f0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13500 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13510 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13520 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
13530 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13540 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
13550 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13560 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13570 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
13580 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
13590 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
135a0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
135b0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
135c0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
135d0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
135e0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
135f0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13600 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13610 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13620 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13630 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
13640 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
13650 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
13660 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
13670 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13680 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13690 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
136a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
136b0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
136c0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
136d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
136e0 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
136f0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
13700 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
13710 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13720 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
13730 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
13740 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
13750 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13760 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
13770 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
13780 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
13790 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
137a0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
137b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
137c0 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
137d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
137e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
137f0 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
13800 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
13810 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
13820 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
13830 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
13840 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
13850 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
13860 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13870 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
13880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13890 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
138a0 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
138b0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63   if( robust_floc
138c0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
138d0 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53  _UN) ){.#ifdef S
138e0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
138f0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
13900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13910 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _OK;.#endif /* S
13920 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
13930 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
13940 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
13950 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13970 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13980 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
13990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
139a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
139b0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
139c0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
139d0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
139e0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
139f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13a00 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66   if( id ){.    f
13a10 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
13a20 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20  O_LOCK);.    rc 
13a30 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
13a40 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
13a50 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
13a60 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
13a70 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
13a80 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
13a90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
13aa0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
13ab0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
13ac0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ae0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13b30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
13ba0 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
13bb0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bd0 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
13be0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
13bf0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
13c00 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
13c10 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
13c20 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
13c30 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
13c40 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
13c50 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
13c60 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
13c70 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
13c80 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
13c90 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
13ca0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
13cb0 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
13cc0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
13cd0 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
13ce0 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
13cf0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
13d00 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
13d10 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
13d20 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
13d30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13d40 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13d50 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13d60 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13d70 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13d80 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13d90 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13da0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13db0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
13dc0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
13dd0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
13de0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
13df0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
13e00 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
13e10 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
13e20 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
13e30 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
13e40 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13e50 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
13e60 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
13e70 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
13e80 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13e90 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
13ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13eb0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13ec0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13ed0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13ee0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
13ef0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13f00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
13f10 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13f20 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
13f30 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
13f40 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
13f50 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
13f60 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
13f70 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
13f80 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
13f90 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
13fa0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
13fb0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
13fc0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
13fd0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
13fe0 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
13ff0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
14000 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
14010 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
14020 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63  >pSem;.    struc
14030 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
14040 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
14050 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
14060 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
14070 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
14080 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
14090 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
140a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
140b0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
140c0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
140d0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
140e0 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
140f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14100 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
14110 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14120 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
14130 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
14140 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20   when we are in 
14150 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20  NO_LOCK */.     
14160 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70     reserved = (p
14170 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14180 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  < SHARED_LOCK);.
14190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
141a0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63  e{.      /* we c
141b0 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20  ould have it if 
141c0 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20  we want it */.  
141d0 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65      sem_post(pSe
141e0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
141f0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14200 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14210 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14220 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
14230 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
14240 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
14250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14260 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
14270 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
14280 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
14290 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
142a0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
142b0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
142c0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
142d0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
142e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
142f0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
14300 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
14310 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
14320 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
14330 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
14340 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
14350 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
14360 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
14370 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
14380 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
14390 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
143a0 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
143b0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
143c0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
143d0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
143e0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
143f0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
14400 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
14410 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
14420 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
14430 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
14440 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
14450 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
14460 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
14470 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
14480 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
14490 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
144a0 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
144b0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
144c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
144d0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
144e0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
144f0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
14500 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
14510 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
14520 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
14530 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
14540 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
14550 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
14560 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
14570 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
14580 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
14590 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
145a0 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
145b0 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
145c0 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
145d0 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
145e0 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
145f0 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
14600 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
14610 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
14620 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
14630 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
14640 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
14650 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
14660 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
14670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14680 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  semLock(sqlite3_
14690 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
146a0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
146b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
146c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
146d0 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20  int fd;.  sem_t 
146e0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
146f0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69  Inode->pSem;.  i
14700 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14710 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
14720 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
14730 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
14740 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
14750 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
14760 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
14770 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
14780 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14790 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
147a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
147b0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
147c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
147d0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  K;.    goto sem_
147e0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
147f0 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70  .  /* lock semap
14800 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69  hore now but bai
14810 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61  l out when alrea
14820 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  dy locked. */.  
14830 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
14840 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
14850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14860 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  Y;.    goto sem_
14870 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
14880 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
14890 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
148a0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
148b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
148c0 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f  FileLock;.. sem_
148d0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75  end_lock:.  retu
148e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
148f0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
14900 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
14910 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14920 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14930 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14940 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14950 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14960 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14970 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14980 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14990 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
149a0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
149b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
149c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
149d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
149e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
149f0 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71  int semUnlock(sq
14a00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14a10 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
14a20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14a30 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14a40 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  id;.  sem_t *pSe
14a50 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
14a60 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  e->pSem;..  asse
14a70 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
14a80 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
14a90 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
14aa0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
14ab0 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
14ac0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
14ad0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
14ae0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14af0 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
14b00 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
14b10 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
14b20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
14b30 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
14b40 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
14b50 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
14b60 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
14b70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14b80 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
14b90 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
14ba0 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
14bb0 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
14bc0 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
14bd0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
14be0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
14bf0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14c00 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
14c10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14c20 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
14c30 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
14c40 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
14c50 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
14c60 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
14c70 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
14c80 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14c90 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14ca0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
14cb0 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
14cc0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
14cd0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
14ce0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14cf0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
14d00 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
14d10 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
14d20 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
14d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14d40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
14d50 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
14d60 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
14d70 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
14d80 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
14d90 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
14da0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14db0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
14dc0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
14dd0 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
14de0 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
14df0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
14e00 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
14e10 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
14e20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
14e30 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
14e40 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
14e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14e60 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
14e70 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
14e80 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
14e90 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
14ea0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
14eb0 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
14ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
14ed0 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
14ee0 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
14ef0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
14f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20  ********* Begin 
14fd0 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
14fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15000 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
15010 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
15020 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
15030 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
15040 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
15050 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
15060 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
15070 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
15080 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
15090 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
150a0 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
150b0 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
150c0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
150d0 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
150e0 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
150f0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
15100 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
15110 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
15120 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
15130 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
15140 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
15150 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
15160 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
15170 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
15180 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
15190 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
151a0 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
151b0 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
151c0 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
151d0 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
151e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
151f0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
15200 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
15210 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
15220 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
15230 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
15240 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
15250 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
15260 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
15270 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
15280 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
15290 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
152a0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
152b0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
152c0 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
152d0 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
152e0 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
152f0 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
15300 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
15310 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
15320 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
15330 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
15340 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
15350 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
15360 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
15370 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
15380 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
153b0 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
153c0 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
153d0 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
153e0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
153f0 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
15400 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
15410 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
15420 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
15430 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
15440 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
15450 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
15460 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
15470 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
15480 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
15490 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
154a0 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
154b0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
154c0 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
154d0 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
154e0 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
154f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
15500 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
15510 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
15520 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
15530 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
15540 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
15550 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15560 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
15570 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15580 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
15590 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
155a0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
155b0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
155c0 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
155d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
155e0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
155f0 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
15600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15610 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
15620 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
15630 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
15640 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
15650 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
15660 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
15670 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
15680 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
15690 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
156a0 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
156b0 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
156c0 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
156d0 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
156e0 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
156f0 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
15700 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
15710 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
15720 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
15730 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
15740 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
15750 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
15760 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
15770 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
15780 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
15790 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
157a0 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
157b0 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
157c0 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
157d0 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
157e0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
157f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
15800 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
15810 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
15820 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
15830 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
15840 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
15850 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
15860 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15870 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
15880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
15890 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
158a0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
158b0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
158c0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
158d0 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
158e0 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
158f0 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
15900 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
15910 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15920 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15930 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
15940 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15950 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
15960 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15970 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
15980 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15990 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
159a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
159b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
159c0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
159d0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
159e0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
159f0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
15a00 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
15a10 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
15a20 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
15a30 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
15a40 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
15a50 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
15a60 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
15a70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
15a80 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
15a90 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
15aa0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
15ab0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
15ac0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15ad0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
15ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15af0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
15b00 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15b10 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
15b20 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
15b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
15b40 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
15b50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15b60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
15b70 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
15b80 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
15b90 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
15ba0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
15bb0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
15bc0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
15bd0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
15be0 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20  le );.  context 
15bf0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
15c00 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
15c10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
15c20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
15c30 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
15c40 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
15c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c60 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
15c70 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
15c80 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
15c90 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
15ca0 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
15cb0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
15cc0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
15cd0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
15ce0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
15cf0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
15d00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
15d10 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15d20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15d30 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
15d40 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
15d50 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
15d60 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
15d70 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
15d80 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
15d90 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
15da0 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
15db0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15dc0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15dd0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
15de0 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
15df0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
15e00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
15e10 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
15e20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
15e30 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
15e40 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
15e50 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
15e60 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
15e70 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
15e80 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15e90 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
15ea0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
15eb0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
15ec0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
15ed0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
15ee0 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
15ef0 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
15f00 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
15f10 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
15f20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
15f30 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
15f40 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
15f50 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
15f60 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
15f70 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
15f80 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
15f90 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
15fa0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
15fb0 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
15fc0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
15fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15fe0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
15ff0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
16000 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
16010 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
16020 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
16030 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
16040 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
16050 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
16060 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
16070 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
16080 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
16090 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
160a0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
160b0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
160c0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
160d0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
160e0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
160f0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
16100 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
16110 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
16120 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
16130 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
16140 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
16150 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
16160 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
16170 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
16180 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
16190 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
161a0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
161b0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
161c0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
161d0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
161e0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
161f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
16200 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
16210 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
16220 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
16230 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
16240 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16250 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
16260 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
16270 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
16280 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
16290 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
162a0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
162b0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
162c0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
162d0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
162e0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
162f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
16300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
16310 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
16320 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
16330 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
16340 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16350 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16360 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
16370 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
16380 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
16390 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
163a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
163b0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
163c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
163d0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
163e0 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
163f0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
16400 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
16410 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
16420 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
16430 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
16440 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
16450 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
16460 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
16470 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
16480 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
16490 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
164a0 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
164b0 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69  >nShared , getpi
164c0 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  d()));..  /* If 
164d0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
164e0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
164f0 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
16500 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
16510 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
16520 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
16530 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64   use the afp_end
16540 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
16550 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
16560 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
16570 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
16580 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
16590 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
165a0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
165b0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
165c0 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
165d0 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29  eady held) (afp)
165e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
165f0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
16600 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
16610 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
16630 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
16640 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
16650 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
16660 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
16670 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
16680 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
16690 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
166a0 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
166b0 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
166c0 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
166d0 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
166e0 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
166f0 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
16700 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
16710 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
16720 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
16730 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
16740 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
16750 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
16760 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
16770 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
16780 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
16790 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
167a0 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
167b0 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
167c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
167d0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
167e0 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
167f0 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
16800 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
16810 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
16820 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
16830 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16840 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
16850 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
16860 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
16870 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
16880 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
16890 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
168a0 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
168b0 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
168c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
168d0 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
168e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
168f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
16900 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16910 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e   && .       (pIn
16920 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
16930 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
16940 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
16950 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a  _LOCK)).     ){.
16960 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16970 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BUSY;.    goto a
16980 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
16990 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48  .  .  /* If a SH
169a0 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
169b0 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
169c0 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
169d0 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
169e0 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
169f0 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
16a00 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
16a10 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
16a20 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
16a30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
16a40 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
16a50 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16a60 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65  && .     (pInode
16a70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
16a80 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
16a90 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
16aa0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
16ab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
16ac0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16ad0 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
16ae0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
16af0 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
16b00 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
16b10 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
16b20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16b30 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
16b40 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
16b50 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
16b60 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
16b70 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16b80 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
16b90 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
16ba0 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
16bb0 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
16bc0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
16bd0 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
16be0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
16bf0 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
16c00 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
16c10 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
16c20 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
16c30 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
16c40 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16c50 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
16c60 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
16c70 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
16c80 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
16c90 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
16ca0 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  int failed;.    
16cb0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
16cc0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16cd0 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16ce0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b  ING_BYTE, 1, 1);
16cf0 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
16d00 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61   {.      rc = fa
16d10 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f  iled;.      goto
16d20 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16d30 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
16d40 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
16d50 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
16d60 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
16d70 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
16d80 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
16d90 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
16da0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
16db0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
16dc0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16dd0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74  _LOCK ){.    int
16de0 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63   lrc1, lrc2, lrc
16df0 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  1Errno = 0;.    
16e00 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20  long lk, mask;. 
16e10 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
16e20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
16e30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16e40 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
16e50 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
16e60 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73    .    mask = (s
16e70 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20  izeof(long)==8) 
16e80 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ? LARGEST_INT64 
16e90 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  : 0x7fffffff;.  
16ea0 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
16eb0 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45   read-lock SHARE
16ec0 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a  D_LOCK */.    /*
16ed0 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71   note that the q
16ee0 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61  uality of the ra
16ef0 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74  ndomness doesn't
16f00 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63   matter that muc
16f10 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61  h */.    lk = ra
16f20 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e  ndom(); .    pIn
16f30 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20  ode->sharedByte 
16f40 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53  = (lk & mask)%(S
16f50 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
16f60 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53  .    lrc1 = afpS
16f70 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16f80 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
16f90 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
16fa0 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
16fb0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
16fc0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16fd0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
16fe0 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
16ff0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
17000 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
17010 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
17020 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
17030 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
17040 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17050 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17060 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
17070 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
17080 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
17090 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
170a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
170b0 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
170c0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
170d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
170e0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
170f0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
17100 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
17110 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
17120 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17130 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17140 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
17150 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
17160 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
17170 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
17180 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
17190 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
171a0 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
171b0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
171c0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
171d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
171e0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
171f0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
17200 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
17210 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
17220 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
17230 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
17240 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
17250 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
17260 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
17270 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
17280 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
17290 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
172a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
172b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
172c0 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
172d0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
172e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
172f0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
17300 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
17310 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
17320 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
17330 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
17340 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
17350 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
17360 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
17370 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
17380 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
17390 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
173a0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
173b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
173c0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
173d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
173e0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
173f0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
17400 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
17410 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17420 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
17430 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
17440 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
17450 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
17460 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
17470 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17480 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
17490 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
174a0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
174b0 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
174c0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
174d0 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
174e0 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
174f0 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
17500 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
17510 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
17520 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
17530 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
17540 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17550 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
17560 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
17570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17580 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
17590 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
175a0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
175b0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175d0 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
175e0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
175f0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
17600 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
17610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
17620 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
17630 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
17640 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
17650 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
17660 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17670 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17680 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17690 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176b0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
176c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
176d0 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
176e0 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
176f0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17700 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
17730 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17740 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
17750 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
17760 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
17770 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
17780 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
17790 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
177a0 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
177b0 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
177c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
177d0 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
177e0 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
177f0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
17800 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17820 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
17830 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
17840 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17850 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
17860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17870 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
17880 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17890 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
178a0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
178b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
178c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
178d0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
178e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
178f0 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
17900 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
17910 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
17920 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17930 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17940 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
17950 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
17960 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
17970 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
17980 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
17990 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
179a0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
179b0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
179c0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
179d0 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
179e0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
179f0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
17a00 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
17a10 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
17a20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
17a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17a40 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17a50 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17a60 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17a70 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
17a80 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
17a90 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17aa0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17ab0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
17ac0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
17ad0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
17ae0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
17af0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
17b00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
17b10 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
17b20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17b30 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
17b40 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
17b50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17b60 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
17b70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17b80 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
17b90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17ba0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
17bb0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
17bc0 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
17bd0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
17be0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
17bf0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
17c00 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
17c10 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
17c20 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
17c30 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
17c40 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
17c50 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
17c60 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
17c70 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
17c80 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
17c90 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
17ca0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
17cb0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
17cc0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17cd0 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
17ce0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
17cf0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
17d00 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
17d10 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
17d20 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
17d30 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
17d40 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
17d50 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
17d60 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
17d70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17d80 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17d90 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
17da0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
17db0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17dc0 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
17dd0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
17de0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
17df0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17e00 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17e10 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
17e20 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
17e30 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17e40 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
17e50 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
17e60 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
17e70 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
17e80 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
17e90 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
17ea0 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
17eb0 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
17ec0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
17ed0 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
17ee0 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
17ef0 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
17f00 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
17f10 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
17f20 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
17f30 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
17f40 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
17f50 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
17f60 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
17f70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17f80 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
17f90 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
17fa0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
17fb0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
17fc0 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
17fd0 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
17fe0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
17ff0 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
18000 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
18010 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
18020 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
18030 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
18040 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
18050 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
18060 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
18070 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18080 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
18090 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
180a0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
180b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
180c0 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
180d0 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20  rChng==1 );.    
180e0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
180f0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
18100 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
18110 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
18120 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
18130 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
18140 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18150 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18160 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
18170 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
18180 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18190 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
181a0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
181b0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
181c0 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20  ared>1) ){.     
181d0 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
181e0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
181f0 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
18200 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
18210 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
18220 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
18230 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
18240 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
18250 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18260 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18270 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
18280 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
18290 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
182a0 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d      skipShared =
182b0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
182c0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
182d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
182e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
182f0 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
18300 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
18310 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18320 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
18330 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
18340 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
18350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18360 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18370 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
18380 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  && context->rese
18390 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  rved ){.      rc
183a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
183b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
183c0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
183d0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
183e0 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20    if( !rc ){ .  
183f0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
18400 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20  eserved = 0; .  
18410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18430 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
18440 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
18450 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
18460 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  1)){.      pInod
18470 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
18480 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
18490 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
184a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69  SQLITE_OK && eFi
184b0 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
184c0 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
184d0 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
184e0 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
184f0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
18500 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
18510 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
18520 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
18530 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
18540 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
18550 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
18560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
18570 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18580 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
18590 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
185a0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
185b0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
185c0 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
185d0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
185e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d  ==0 ){.      Sim
185f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18600 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
18610 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
18620 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
18630 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18640 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
18650 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a   !skipShared ){.
18660 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
18670 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18680 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18690 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
186a0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
186b0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
186c0 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
186d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
186e0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
186f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18700 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
18710 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18730 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
18740 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
18750 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
18760 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
18770 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
18780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
18790 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
187a0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
187b0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
187c0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
187d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
187e0 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
187f0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
18800 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
18810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
18820 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
18830 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
18840 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
18850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18860 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
18870 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
18880 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18890 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
188a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
188b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
188c0 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69  .    afpUnlock(i
188d0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
188e0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
188f0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
18900 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
18910 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
18920 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
18930 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
18940 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
18950 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
18960 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
18970 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
18980 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
18990 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
189a0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
189b0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
189c0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
189d0 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69  o pInode->aPendi
189e0 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
189f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
18a00 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20  osed when.      
18a10 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  ** the last lock
18a20 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
18a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50     */.      setP
18a40 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
18a50 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
18a60 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
18a70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
18a80 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
18a90 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
18aa0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
18ab0 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69  ile(id);.    uni
18ac0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
18ad0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18ae0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
18af0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
18b00 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
18b10 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
18b20 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
18b30 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46   above is the AF
18b40 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
18b50 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
18b60 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
18b70 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
18b80 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
18b90 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
18ba0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
18bb0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
18bc0 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f  able.  If you do
18bd0 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20  n't compile for 
18be0 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20  a mac, then the 
18bf0 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46  "unix-afp".** VF
18c00 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  S is not availab
18c10 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
18c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
18c30 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   of the AFP lock
18c40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
18c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c60 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cb0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
18cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 2a 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f  *** Begin NFS Lo
18d30 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
18d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d50 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66  ******/..#if def
18d60 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
18d70 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
18d80 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
18d90 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  *. ** Lower the 
18da0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
18db0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18dc0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
18dd0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
18de0 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
18df0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
18e00 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20  ARED_LOCK.. **. 
18e10 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
18e20 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
18e30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
18e40 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
18e50 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65  below. ** the re
18e60 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
18e70 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
18e80 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
18e90 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
18ea0 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fsUnlock(sqlite3
18eb0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
18ec0 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
18ed0 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
18ee0 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31  id, eFileLock, 1
18ef0 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
18f00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
18f10 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
18f20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
18f30 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
18f40 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
18f50 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
18f60 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
18f70 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
18f80 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
18f90 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
18fa0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
18fb0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
18fc0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
18fd0 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  ailable.  .**.**
18fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ff0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e  *** End of the N
19000 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
19010 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
19020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
190d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
190e0 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69  Non-locking sqli
190f0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
19100 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
19110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
19120 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69  *.** The next di
19130 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
19140 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
19150 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20  for all methods 
19160 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  of the .** sqlit
19170 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f  e3_file object o
19180 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  ther than the lo
19190 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20  cking methods.  
191a0 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d  The locking.** m
191b0 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69  ethods were defi
191c0 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73  ned in divisions
191d0 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b   above (one lock
191e0 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a  ing method per.*
191f0 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68  * division).  Th
19200 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  ose methods that
19210 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   are common to a
19220 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73  ll locking modes
19230 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74  .** are gather t
19240 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69  ogether into thi
19250 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a  s division..*/..
19260 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
19270 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20  e offset passed 
19280 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
19290 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61  gument, then rea
192a0 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20  d cnt .** bytes 
192b0 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72  into pBuf. Retur
192c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
192d0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
192e0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20  ead..**.** NB:  
192f0 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53  If you define US
19300 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50  E_PREAD or USE_P
19310 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20  READ64, then it 
19320 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65  might also.** be
19330 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65   necessary to de
19340 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
19350 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54  CE to be 500.  T
19360 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a  his varies from.
19370 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f  ** one system to
19380 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65   another.  Since
19390 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
193a0 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
193b0 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72  D.** any any for
193c0 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
193d0 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
193e0 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
193f0 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
19400 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
19410 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a  and #2681..**.**
19420 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
19430 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
19440 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72  ue on a failed r
19450 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ead the lastErrn
19460 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
19470 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
19480 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19490 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
194a0 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
194b0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
194c0 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
194d0 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
194e0 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d  t;.  int prior =
194f0 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65   0;.#if (!define
19500 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
19510 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19520 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
19530 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
19540 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20   TIMER_START;.  
19550 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e  assert( cnt==(cn
19560 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  t&0x1ffff) );.  
19570 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20  assert( id->h>2 
19580 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31 66  );.  cnt &= 0x1f
19590 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  fff;.  do{.#if d
195a0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
195b0 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72  ).    got = osPr
195c0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
195d0 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
195e0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
195f0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
19600 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
19610 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67  E_PREAD64).    g
19620 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
19630 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
19640 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
19650 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
19660 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
19670 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
19680 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
19690 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
196a0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
196b0 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
196c0 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  - );.    if( new
196d0 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
196e0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f  {.      if( newO
196f0 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20  ffset == -1 ){. 
19700 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c         ((unixFil
19710 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
19720 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
19730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
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 30 3b 0a  >lastErrno = 0;.
19760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
19770 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
19780 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28     got = osRead(
19790 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
197a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
197b0 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65  ( got==cnt ) bre
197c0 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c  ak;.    if( got<
197d0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
197e0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67  rrno==EINTR ){ g
197f0 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65  ot = 1; continue
19800 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ; }.      prior 
19810 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75 6e 69  = 0;.      ((uni
19820 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
19830 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
19840 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19850 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
19860 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
19870 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
19880 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
19890 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
198a0 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
198b0 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
198c0 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
198d0 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
198e0 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
198f0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
19900 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
19910 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
19920 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
19930 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
19940 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
19950 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
19960 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
19970 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
19980 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
19990 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
199a0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
199b0 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
199c0 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
199d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
199e0 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
199f0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
19a00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
19a10 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
19a20 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
19a30 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
19a40 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
19a50 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
19a60 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
19a70 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
19a80 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
19a90 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
19aa0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
19ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
19ac0 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
19ad0 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
19ae0 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
19af0 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
19b00 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
19b10 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
19b20 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
19b30 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
19b40 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
19b50 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
19b60 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
19b70 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
19b80 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
19b90 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
19ba0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
19bb0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
19bc0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
19bd0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  if..#if SQLITE_M
19be0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
19bf0 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
19c00 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65   much of this re
19c10 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  ad request as po
19c20 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
19c30 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
19c40 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
19c50 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
19c60 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
19c70 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
19c80 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
19c90 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
19ca0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
19cb0 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
19cc0 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
19cd0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
19ce0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d  on))[offset], am
19cf0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
19d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
19d20 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e   nCopy = pFile->
19d30 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
19d40 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  t;.      memcpy(
19d50 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
19d60 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
19d70 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
19d80 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
19d90 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
19da0 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
19db0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
19dc0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
19dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
19de0 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b  if..  got = seek
19df0 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f  AndRead(pFile, o
19e00 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
19e10 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d  );.  if( got==am
19e20 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
19e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
19e40 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  se if( got<0 ){.
19e50 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
19e60 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
19e70 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ead */.    retur
19e80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
19e90 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
19ea0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
19eb0 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
19ec0 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
19ed0 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
19ee0 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
19ef0 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
19f00 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
19f10 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
19f20 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
19f30 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
19f40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
19f50 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
19f60 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
19f70 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65  to seek the file
19f80 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73  -descriptor pass
19f90 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
19fa0 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61  argument to.** a
19fb0 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69  bsolute offset i
19fc0 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70  Off, then attemp
19fd0 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20  t to write nBuf 
19fe0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72  bytes of data fr
19ff0 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74  om.** pBuf to it
1a000 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1a010 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20  curs, return -1 
1a020 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f  and set *piErrno
1a030 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
1a040 20 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75   return the actu
1a050 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
1a060 65 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63  es written (whic
1a070 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68  h may be less th
1a080 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a  an.** nBuf)..*/.
1a090 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
1a0a0 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74  ndWriteFd(.  int
1a0b0 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20   fd,            
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a0d0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1a0e0 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
1a0f0 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20   i64 iOff,      
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20   /* File offset 
1a120 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67  to begin writing
1a130 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76   at */.  const v
1a140 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1a150 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
1a160 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
1a170 62 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69  buffer to the fi
1a180 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66  le */.  int nBuf
1a190 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a1a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a1b0 6f 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69  of buffer pBuf i
1a1c0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
1a1d0 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20   *piErrno       
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a1f0 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65  OUT: Error numbe
1a200 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72  r if error occur
1a210 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
1a220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1a230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1a240 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1a250 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20  ystem call */.. 
1a260 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28   assert( nBuf==(
1a270 6e 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b  nBuf&0x1ffff) );
1a280 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20  .  assert( fd>2 
1a290 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31  );.  nBuf &= 0x1
1a2a0 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54  ffff;.  TIMER_ST
1a2b0 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  ART;..#if define
1a2c0 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
1a2d0 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74 65  o{ rc = osPwrite
1a2e0 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1a2f0 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20   iOff); }while( 
1a300 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1a310 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65  INTR );.#elif de
1a320 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
1a330 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  4).  do{ rc = os
1a340 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75  Pwrite64(fd, pBu
1a350 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d  f, nBuf, iOff);}
1a360 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1a370 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65  rrno==EINTR);.#e
1a380 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36  lse.  do{.    i6
1a390 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28  4 iSeek = lseek(
1a3a0 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53  fd, iOff, SEEK_S
1a3b0 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1a3c0 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 2d  eIOError( iSeek-
1a3d0 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 53  - );..    if( iS
1a3e0 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20  eek!=iOff ){.   
1a3f0 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20 29     if( piErrno )
1a400 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53 65   *piErrno = (iSe
1a410 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a  ek==-1 ? errno :
1a420 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
1a430 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
1a440 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
1a450 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20   pBuf, nBuf);.  
1a460 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1a470 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1a480 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f  #endif..  TIMER_
1a490 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
1a4a0 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
1a4b0 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
1a4c0 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54   fd, rc, iOff, T
1a4d0 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1a4e0 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 70  .  if( rc<0 && p
1a4f0 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e  iErrno ) *piErrn
1a500 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74  o = errno;.  ret
1a510 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1a520 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
1a530 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
1a540 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
1a550 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
1a560 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1a570 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a580 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
1a590 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
1a5a0 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  t..**.** To avoi
1a5b0 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
1a5c0 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
1a5d0 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65  failed write the
1a5e0 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
1a5f0 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
1a600 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1a610 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
1a620 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
1a630 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
1a640 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
1a650 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
1a660 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72  return seekAndWr
1a670 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66  iteFd(id->h, off
1a680 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  set, pBuf, cnt, 
1a690 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b  &id->lastErrno);
1a6a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
1a6b0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1a6c0 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
1a6d0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1a6e0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
1a6f0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
1a700 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
1a710 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
1a720 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
1a730 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1a740 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
1a750 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
1a760 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
1a770 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
1a780 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1a790 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1a7a0 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
1a7b0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
1a7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1a7d0 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1a7e0 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1a7f0 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1a800 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1a810 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1a820 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1a830 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1a840 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1a850 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1a860 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1a870 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1a880 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
1a890 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1a8a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1a8b0 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1a8c0 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1a8d0 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1a8e0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1a8f0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  _DEBUG.  /* If w
1a900 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1a910 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1a920 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1a930 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
1a940 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1a950 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1a960 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1a970 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1a980 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
1a990 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
1a9a0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
1a9b0 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
1a9c0 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
1a9d0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
1a9e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1a9f0 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
1aa00 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
1aa10 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
1aa20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e  .  if( pFile->in
1aa30 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20  NormalWrite ){. 
1aa40 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
1aa50 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
1aa60 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1aa70 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
1aa80 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
1aa90 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
1aaa0 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
1aab0 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
1aac0 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
1aad0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1aae0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1aaf0 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
1ab00 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
1ab10 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
1ab20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1ab30 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1ab40 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
1ab50 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
1ab60 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
1ab70 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
1ab80 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1ab90 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1aba0 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
1abb0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
1abc0 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
1abd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1abe0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1abf0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1ac00 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
1ac10 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
1ac20 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
1ac30 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1ac40 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1ac50 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1ac60 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1ac70 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1ac80 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1ac90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1aca0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1acb0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1acc0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1acd0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1ace0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1acf0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1ad00 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  f, amt);.      r
1ad10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ad20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ad30 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1ad40 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1ad50 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1ad60 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1ad70 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1ad80 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1ad90 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1ada0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1adb0 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1adc0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1add0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1ade0 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1adf0 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
1ae00 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
1ae10 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1ae20 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1ae30 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b  pBuf, amt))>0 ){
1ae40 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
1ae50 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
1ae60 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
1ae70 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
1ae80 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
1ae90 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1aea0 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
1aeb0 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
1aec0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1aed0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
1aee0 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
1aef0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
1af00 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
1af10 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
1af20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
1af30 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
1af40 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
1af50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1af60 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1af70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1af80 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1af90 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
1afa0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1afb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1afc0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1afd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1afe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1aff0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1b000 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1b010 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1b020 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1b030 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1b040 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1b050 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1b060 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1b070 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1b080 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1b090 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1b0a0 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1b0b0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1b0c0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1b0d0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1b0e0 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1b0f0 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1b100 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1b110 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1b120 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1b130 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1b140 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1b150 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1b160 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1b170 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1b180 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1b190 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1b1a0 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1b1b0 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1b1c0 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1b1d0 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
1b1e0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1b1f0 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69  datasync).# defi
1b200 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1b210 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1b220 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1b230 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1b240 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1b250 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1b260 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1b270 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1b280 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1b290 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1b2a0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1b2b0 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1b2c0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1b2d0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1b2e0 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1b2f0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1b300 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1b310 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1b320 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1b330 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
1b340 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
1b350 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
1b360 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
1b370 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
1b380 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
1b390 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
1b3a0 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
1b3b0 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
1b3c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1b3d0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
1b3e0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
1b3f0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
1b400 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
1b410 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
1b420 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
1b430 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1b440 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
1b450 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
1b460 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1b470 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1b480 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1b490 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1b4a0 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1b4b0 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1b4c0 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1b4d0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1b4e0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1b4f0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1b500 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1b510 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1b520 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1b530 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1b540 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1b550 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1b560 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1b570 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1b580 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1b590 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1b5a0 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1b5b0 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1b5c0 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1b5d0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1b5e0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1b5f0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1b600 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1b610 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1b620 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1b630 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1b640 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1b650 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1b660 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1b670 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1b680 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1b690 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1b6a0 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1b6b0 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1b6c0 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1b6d0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1b6e0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1b6f0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1b700 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1b710 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1b720 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1b730 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1b740 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1b750 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1b760 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1b770 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1b780 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1b790 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1b7a0 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1b7b0 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1b7c0 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1b7d0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1b7e0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1b7f0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1b800 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1b810 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1b820 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1b830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b840 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1b850 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1b860 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1b870 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1b880 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1b890 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1b8a0 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1b8b0 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1b8c0 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1b8d0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1b8e0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1b8f0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1b900 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1b910 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1b920 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1b930 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1b940 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1b950 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1b960 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1b970 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1b980 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1b990 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1b9a0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1b9b0 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1b9c0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1b9d0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1b9e0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1b9f0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1ba00 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1ba10 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1ba20 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1ba30 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1ba40 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1ba50 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1ba60 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1ba70 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1ba80 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1ba90 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1baa0 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1bab0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1bac0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1bad0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1bae0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1baf0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1bb00 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1bb10 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1bb20 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1bb30 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1bb40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1bb50 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1bb60 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1bb70 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1bb80 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1bb90 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
1bba0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1bbb0 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
1bbc0 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  OK;.#elif HAVE_F
1bbd0 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66  ULLFSYNC.  if( f
1bbe0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
1bbf0 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  c = osFcntl(fd, 
1bc00 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
1bc10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1bc20 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1bc30 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1bc40 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1bc50 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1bc60 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1bc70 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1bc80 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1bc90 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1bca0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1bcb0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1bcc0 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1bcd0 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1bce0 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1bcf0 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1bd00 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1bd10 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1bd20 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1bd30 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1bd40 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1bd50 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1bd60 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1bd70 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1bd80 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1bd90 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1bda0 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1bdb0 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1bdc0 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1bdd0 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1bde0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1bdf0 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1be00 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1be10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1be20 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1be30 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1be40 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1be50 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1be60 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1be70 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1be80 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1be90 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1bea0 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1beb0 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1bec0 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1bed0 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1bee0 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1bef0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1bf00 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1bf10 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1bf20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1bf30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1bf40 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1bf50 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1bf60 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1bf70 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1bf80 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1bf90 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1bfa0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1bfb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1bfc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1bfd0 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1bfe0 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1bff0 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1c000 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1c010 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1c020 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1c030 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1c040 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1c050 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c060 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1c070 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1c080 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1c090 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1c0a0 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1c0b0 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1c0c0 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1c0d0 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1c0e0 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1c0f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1c100 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1c110 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1c120 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1c130 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1c140 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1c150 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1c160 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1c170 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1c180 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1c190 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1c1a0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1c1b0 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1c1c0 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1c1d0 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1c1e0 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1c1f0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1c200 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1c210 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1c220 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1c230 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1c240 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1c250 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1c260 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1c270 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1c280 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1c290 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1c2a0 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1c2b0 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1c2c0 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1c2d0 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1c2e0 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1c2f0 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1c300 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1c310 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1c320 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1c330 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1c340 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1c350 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1c360 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1c370 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1c380 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
1c390 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1c3a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1c3b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c3c0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
1c3d0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1c3e0 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
1c3f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1c400 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
1c410 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1c420 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
1c430 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1c440 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
1c450 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
1c460 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
1c470 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
1c480 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
1c490 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1c4a0 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
1c4b0 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
1c4c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
1c4d0 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
1c4e0 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26  irname); ii>1 &&
1c4f0 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
1c500 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
1c510 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
1c520 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
1c530 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
1c540 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1c550 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1c560 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  RY, 0);.    if( 
1c570 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  fd>=0 ){.      O
1c580 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1c590 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1c5a0 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
1c5b0 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1c5c0 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1c5d0 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
1c5e0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1c5f0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1c600 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
1c610 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  e));.}../*.** Ma
1c620 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1c630 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1c640 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1c650 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1c660 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1c670 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1c680 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1c690 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1c6a0 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1c6b0 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1c6c0 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1c6d0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1c6e0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1c6f0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1c700 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1c710 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1c720 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1c730 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1c740 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1c750 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1c760 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1c770 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1c780 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1c790 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1c7a0 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1c7b0 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1c7c0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1c7d0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1c7e0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1c7f0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1c800 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1c810 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1c820 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1c830 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1c840 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1c850 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1c860 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1c870 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1c880 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1c890 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1c8a0 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1c8b0 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1c8c0 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1c8d0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1c8e0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1c8f0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1c900 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1c910 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1c920 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1c930 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1c940 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1c950 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1c960 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1c970 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1c980 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1c990 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1c9a0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1c9b0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1c9c0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1c9d0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1c9e0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1c9f0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1ca00 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1ca10 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1ca20 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1ca30 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1ca40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1ca50 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1ca60 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1ca70 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1ca80 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1ca90 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1caa0 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1cab0 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1cac0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1cad0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1cae0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1caf0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1cb00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1cb10 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1cb20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1cb30 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1cb40 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1cb50 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1cb60 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1cb70 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1cb80 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1cb90 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1cba0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1cbb0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1cbc0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1cbd0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1cbe0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1cbf0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1cc00 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1cc10 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
1cc20 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
1cc30 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1cc40 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
1cc50 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
1cc60 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
1cc70 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
1cc80 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61   occurrence.  Ma
1cc90 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
1cca0 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
1ccb0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
1ccc0 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
1ccd0 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
1cce0 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
1ccf0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1cd00 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1cd10 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
1cd20 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
1cd30 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
1cd40 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
1cd50 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
1cd60 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
1cd70 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
1cd80 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
1cd90 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
1cda0 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
1cdb0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1cdc0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
1cdd0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1cde0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
1cdf0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
1ce00 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
1ce10 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
1ce20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1ce30 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
1ce40 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E__);.    }else 
1ce50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
1ce60 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
1ce70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ce80 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1ce90 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1cea0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1ceb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cec0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1ced0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1cee0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1cef0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1cf00 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1cf10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1cf20 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1cf30 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1cf40 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1cf50 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1cf60 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1cf70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1cf80 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1cf90 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1cfa0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1cfb0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1cfc0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1cfd0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1cfe0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1cff0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1d000 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1d010 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1d020 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1d030 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1d040 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1d050 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1d060 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1d070 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1d080 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1d090 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1d0a0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
1d0b0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1d0c0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1d0d0 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1d0e0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1d0f0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1d100 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1d110 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66  te(pFile->h, (of
1d120 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66  f_t)nByte);.  if
1d130 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1d140 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1d150 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1d160 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1d170 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1d180 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1d190 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1d1a0 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
1d1b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1d1c0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1d1d0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1d1e0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1d1f0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1d200 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
1d210 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1d220 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1d230 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1d240 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1d250 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
1d260 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
1d270 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
1d280 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1d290 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
1d2a0 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
1d2b0 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
1d2c0 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
1d2d0 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
1d2e0 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
1d2f0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
1d300 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
1d310 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
1d320 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
1d330 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
1d340 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1d350 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
1d360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
1d370 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
1d380 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
1d390 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1d3a0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1d3b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
1d3c0 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e  le was just trun
1d3d0 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
1d3e0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1d3f0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
1d400 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c  * mapped region,
1d410 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1d420 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69  ctive mapping si
1d430 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69  ze as well. SQLi
1d440 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75  te will.    ** u
1d450 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
1d460 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
1d470 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
1d480 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
1d490 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  on.  .    */.   
1d4a0 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65   if( nByte<pFile
1d4b0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1d4c0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1d4d0 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
1d4e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1d4f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d500 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1d510 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1d520 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1d530 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1d540 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1d550 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1d560 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1d570 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1d580 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1d590 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1d5a0 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1d5b0 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1d5c0 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1d5d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1d5e0 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1d5f0 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  !=0 ){.    ((uni
1d600 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
1d610 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1d620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d630 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1d640 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1d650 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1d660 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1d670 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1d680 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1d690 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1d6a0 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1d6b0 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1d6c0 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1d6d0 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1d6e0 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1d6f0 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1d700 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1d710 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1d720 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1d730 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1d740 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1d750 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1d760 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1d770 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1d780 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1d790 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1d7a0 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1d7b0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1d7c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d7d0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1d7e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d7f0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1d800 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1d810 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1d820 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1d830 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1d840 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1d850 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1d860 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1d870 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1d880 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1d890 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1d8a0 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1d8b0 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1d8c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d8d0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1d8e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1d8f0 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1d900 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1d910 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1d920 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1d930 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1d940 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1d950 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1d960 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1d970 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1d980 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1d990 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1d9a0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1d9b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1d9c0 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1d9d0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1d9e0 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1d9f0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1da00 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1da30 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1da40 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da60 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1da70 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1da80 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1da90 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1daa0 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20  ile->h, &buf) ) 
1dab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1dac0 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20  ERR_FSTAT;..    
1dad0 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1dae0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1daf0 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1db00 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1db10 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1db20 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1db30 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1db40 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1db50 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1db60 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1db70 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1db80 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1db90 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1dba0 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1dbb0 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1dbc0 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1dbd0 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1dbe0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1dbf0 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1dc00 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1dc10 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1dc20 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1dc30 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1dc40 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1dc50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1dc60 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1dc70 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1dc80 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1dc90 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1dca0 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1dcb0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1dcc0 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1dcd0 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
1dce0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1dcf0 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
1dd00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
1dd10 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
1dd20 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1dd30 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74  , fake it. First
1dd40 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74   use.      ** ft
1dd50 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74  runcate() to set
1dd60 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1dd70 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e  then write a sin
1dd80 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20  gle byte to.    
1dd90 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79    ** the last by
1dda0 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1ddb0 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1ddc0 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69  nded region. Thi
1ddd0 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
1dde0 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65  e same technique
1ddf0 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74   used by glibc t
1de00 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69  o implement posi
1de10 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20  x_fallocate().  
1de20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d      ** on system
1de30 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
1de40 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1de50 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ate() system cal
1de60 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
1de70 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66    int nBlk = buf
1de80 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a  .st_blksize;  /*
1de90 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f   File-system blo
1dea0 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ck size */.     
1deb0 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20   i64 iWrite;    
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ded0 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77  Next offset to w
1dee0 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1def0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1df00 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1df10 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20   nSize) ){.     
1df20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1df30 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1df40 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
1df50 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1df60 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1df70 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1df80 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1df90 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65    }.      iWrite
1dfa0 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65   = ((buf.st_size
1dfb0 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e   + 2*nBlk - 1)/n
1dfc0 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20  Blk)*nBlk-1;.   
1dfd0 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65     while( iWrite
1dfe0 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  <nSize ){.      
1dff0 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73    int nWrite = s
1e000 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1e010 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1e020 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1e030 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1e040 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1e050 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57  RITE;.        iW
1e060 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20  rite += nBlk;.  
1e070 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e080 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
1e090 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1e0a0 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
1e0b0 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26  mmapSizeMax>0 &&
1e0c0 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d   nByte>pFile->mm
1e0d0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  apSize ){.    in
1e0e0 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
1e0f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
1e100 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
1e110 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1e120 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
1e130 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1e140 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1e150 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
1e160 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1e170 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1e180 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1e190 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1e1a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e1b0 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d  ..    rc = unixM
1e1c0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  apfile(pFile, nB
1e1d0 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  yte);.    return
1e1e0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1e1f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e200 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
1e210 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74   *pArg is initit
1e220 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74  ially negative t
1e230 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75  hen this is a qu
1e240 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20  ery.  Set *pArg 
1e250 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70  to.** 1 or 0 dep
1e260 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1e270 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73  r or not bit mas
1e280 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  k of pFile->ctrl
1e290 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a  Flags is set..**
1e2a0 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
1e2b0 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65  0 or 1, then cle
1e2c0 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  ar or set the ma
1e2d0 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d  sk bit of pFile-
1e2e0 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73  >ctrlFlags..*/.s
1e2f0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d  tatic void unixM
1e300 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20  odeBit(unixFile 
1e310 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
1e320 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
1e330 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
1e340 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
1e350 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
1e360 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
1e370 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
1e380 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
1e390 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1e3a0 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
1e3b0 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
1e3c0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
1e3d0 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
1e3e0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1e3f0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
1e400 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
1e410 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
1e420 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66  Buf);../*.** Inf
1e430 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e  ormation and con
1e440 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20  trol of an open 
1e450 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
1e460 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1e470 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1e480 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1e490 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1e4a0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1e4b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1e4c0 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  )id;.  switch( o
1e4d0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1e4e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
1e4f0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
1e500 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1e510 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  e->eFileLock;.  
1e520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e530 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e540 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
1e550 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1e560 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1e570 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
1e580 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e590 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e5a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e5b0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
1e5c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1e5d0 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
1e5e0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
1e5f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e600 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e610 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1e620 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  HINT: {.      in
1e630 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75  t rc;.      Simu
1e640 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1e650 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1e660 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70   fcntlSizeHint(p
1e670 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41  File, *(i64 *)pA
1e680 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  rg);.      Simul
1e690 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1e6a0 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (0);.      retur
1e6b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e6c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e6d0 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1e6e0 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1e6f0 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1e700 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1e710 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1e720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e730 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e740 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e750 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1e760 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  RITE: {.      un
1e770 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1e780 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20   UNIXFILE_PSOW, 
1e790 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1e7a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e7b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e7c0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e7d0 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  _VFSNAME: {.    
1e7e0 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1e7f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1e800 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70  f("%s", pFile->p
1e810 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
1e820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e830 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e840 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e850 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
1e860 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
1e870 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
1e880 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56 66  lloc( pFile->pVf
1e890 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
1e8a0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
1e8b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
1e8c0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
1e8d0 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1e8e0 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
1e8f0 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1e900 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1e910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e930 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e940 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
1e950 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
1e960 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
1e970 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
1e980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1e9a0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1e9b0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1e9c0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e9d0 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1e9e0 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1e9f0 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1ea00 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1ea10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1ea20 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1ea30 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ea40 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1ea50 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1ea60 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ea70 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1ea80 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
1ea90 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
1eaa0 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
1eab0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
1eac0 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
1ead0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
1eae0 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
1eaf0 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
1eb00 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1eb10 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
1eb20 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
1eb30 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
1eb40 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55  .          unixU
1eb50 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
1eb60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1eb70 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
1eb80 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
1eb90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1eba0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ebb0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1ebc0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1ebd0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
1ebe0 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
1ebf0 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
1ec00 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
1ec10 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
1ec20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1ec30 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
1ec40 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
1ec50 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
1ec60 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
1ec70 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
1ec80 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
1ec90 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
1eca0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ecb0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1ecc0 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
1ecd0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1ece0 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
1ecf0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1ed00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ed10 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1ed20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1ed30 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1ed40 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1ed50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45    case SQLITE_SE
1ed60 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1ed70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ed80 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
1ed90 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LE: {.      retu
1eda0 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  rn proxyFileCont
1edb0 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b  rol(id,op,pArg);
1edc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1edd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1ede0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1edf0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1ee00 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  _) */.  }.  retu
1ee10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
1ee20 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
1ee30 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
1ee40 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
1ee50 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
1ee60 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
1ee70 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
1ee80 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
1ee90 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
1eea0 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
1eeb0 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
1eec0 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
1eed0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
1eee0 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
1eef0 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
1ef00 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
1ef10 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
1ef20 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
1ef30 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
1ef40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
1ef50 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
1ef60 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
1ef70 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
1ef80 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
1ef90 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
1efa0 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
1efb0 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f  th..*/.#ifndef _
1efc0 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69  _QNXNTO__ .stati
1efd0 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
1efe0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1eff0 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
1f000 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f010 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
1f020 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
1f030 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
1f040 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1f050 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72  he following ver
1f060 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74  sion of unixSect
1f070 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69  orSize() is opti
1f080 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a  mized for QNX..*
1f090 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54  /.#ifdef __QNXNT
1f0a0 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  O__.#include <sy
1f0b0 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69  s/dcmd_blk.h>.#i
1f0c0 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
1f0d0 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e  vfs.h>.static in
1f0e0 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  t unixSectorSize
1f0f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1f100 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
1f110 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1f120 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69  e*)id;.  if( pFi
1f130 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f140 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  = 0 ){.    struc
1f150 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f  t statvfs fsInfo
1f160 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a  ;.       .    /*
1f170 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f   Set defaults fo
1f180 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20  r non-supported 
1f190 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20  filesystems */. 
1f1a0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1f1b0 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
1f1c0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
1f1d0 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  E;.    pFile->de
1f1e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f1f0 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ics = 0;.    if(
1f200 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d   fstatvfs(pFile-
1f210 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  >h, &fsInfo) == 
1f220 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  -1 ) {.      ret
1f230 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  urn pFile->secto
1f240 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  rSize;.    }..  
1f250 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73    if( !strcmp(fs
1f260 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1f270 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20   "tmp") ) {.    
1f280 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f290 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1f2a0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1f2b0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f2c0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1f2d0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f2e0 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20  ATOMIC4K |      
1f2f0 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65   /* All ram file
1f300 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72  system writes ar
1f310 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
1f320 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f330 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
1f340 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
1f350 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
1f360 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
1f3a0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
1f3b0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1f3c0 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
1f3d0 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
1f3e0 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
1f3f0 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
1f430 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
1f440 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1f450 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f  strstr(fsInfo.f_
1f460 62 61 73 65 74 79 70 65 2c 20 22 65 74 66 73 22  basetype, "etfs"
1f470 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f480 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f490 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f4a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f4b0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f4c0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65  s =.        /* e
1f4d0 74 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65  tfs cluster size
1f4e0 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1f4f0 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70  ic */.        (p
1f500 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f510 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1f520 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1f530 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
1f540 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1f550 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1f560 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1f570 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1f580 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1f5b0 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1f5c0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f5d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f5e0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1f5f0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1f600 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1f610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1f640 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1f650 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1f660 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66  se if( !strcmp(f
1f670 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f680 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20  , "qnx6") ){.   
1f690 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1f6a0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1f6b0 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1f6c0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1f6d0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1f6e0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f6f0 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20  _ATOMIC |       
1f700 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73    /* All filesys
1f710 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1f720 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1f730 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1f740 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1f750 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1f760 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1f770 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f7a0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1f7b0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1f7c0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1f7d0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1f7e0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1f7f0 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1f800 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f830 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1f840 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1f850 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74     }else if( !st
1f860 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
1f870 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20  setype, "qnx4") 
1f880 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1f890 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1f8a0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1f8b0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f8c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f8d0 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c  =.        /* ful
1f8e0 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d  l bitset of atom
1f8f0 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63  ics from max sec
1f900 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61  tor size and sma
1f910 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ller */.        
1f920 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ((pFile->sectorS
1f930 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
1f940 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1f950 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a  12) << 1) - 2 |.
1f960 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f970 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1f980 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1f990 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1f9a0 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1f9e0 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1f9f0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1fa00 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49  e if( strstr(fsI
1fa10 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1fa20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20  "dos") ){.      
1fa30 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fa40 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1fa50 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1fa60 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fa70 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1fa80 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20   /* full bitset 
1fa90 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20  of atomics from 
1faa0 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20  max sector size 
1fab0 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20  and smaller */. 
1fac0 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e         ((pFile->
1fad0 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
1fae0 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
1faf0 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29  ATOMIC512) << 1)
1fb00 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53   - 2 |.        S
1fb10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1fb20 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1fb30 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1fb40 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1fb50 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fb80 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1fb90 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1fba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fbb0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1fbc0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1fbd0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1fbe0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20  CAP_ATOMIC512 | 
1fbf0 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61       /* blocks a
1fc00 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1fc10 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fc20 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
1fc30 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
1fc40 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1fc50 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
1fc90 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
1fca0 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     0;.    }.  }.
1fcb0 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65    /* Last chance
1fcc0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20   verification.  
1fcd0 49 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  If the sector si
1fce0 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69  ze isn't a multi
1fcf0 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20  ple of 512.  ** 
1fd00 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61  then it isn't va
1fd10 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69  lid.*/.  if( pFi
1fd20 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25  le->sectorSize %
1fd30 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20   512 != 0 ){.   
1fd40 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1fd50 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20  aracteristics = 
1fd60 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  0;.    pFile->se
1fd70 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54  ctorSize = SQLIT
1fd80 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1fd90 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1fda0 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  urn pFile->secto
1fdb0 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  rSize;.}.#endif 
1fdc0 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f  /* __QNXNTO__ */
1fdd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1fde0 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
1fdf0 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
1fe00 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
1fe10 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70  is VFS is set up
1fe20 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
1fe30 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1fe40 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64  E_OVERWRITE by d
1fe50 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76  efault..** Howev
1fe60 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20  er, that choice 
1fe70 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69 61 6c  is contraversial
1fe80 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c   since technical
1fe90 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ly the underlyin
1fea0 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d  g.** file system
1feb0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73   does not always
1fec0 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61   provide powersa
1fed0 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20  fe overwrites.  
1fee0 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72  (In other.** wor
1fef0 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65  ds, after a powe
1ff00 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61  r-loss event, pa
1ff10 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20  rts of the file 
1ff20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a  that were never.
1ff30 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  ** written might
1ff40 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c   end up being al
1ff50 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72  tered.)  However
1ff60 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76  , non-PSOW behav
1ff70 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20  ior is very,.** 
1ff80 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20  very rare.  And 
1ff90 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d  asserting PSOW m
1ffa0 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64  akes a large red
1ffb0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d  uction in the am
1ffc0 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69  ount.** of requi
1ffd0 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72  red I/O for jour
1ffe0 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20  naling, since a 
1fff0 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69  lot of padding i
20000 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a  s eliminated..**
20010 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50    Hence, while P
20020 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20030 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  TE is on by defa
20040 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20  ult, there is a 
20050 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20  file-control.** 
20060 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
20070 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49  n it off and URI
20080 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
20090 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
200a0 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74  rn it off..*/.st
200b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
200c0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
200d0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
200e0 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
200f0 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a   *p = (unixFile*
20100 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
20110 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  0;.#ifdef __QNXN
20120 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65  TO__.  if( p->se
20130 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e  ctorSize==0 ) un
20140 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29  ixSectorSize(id)
20150 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69  ;.  rc = p->devi
20160 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20170 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  s;.#endif.  if( 
20180 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  p->ctrlFlags & U
20190 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a  NIXFILE_PSOW ){.
201a0 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45      rc |= SQLITE
201b0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
201c0 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a  _OVERWRITE;.  }.
201d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
201e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
201f0 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20  MIT_WAL.../*.** 
20200 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
20210 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
20220 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
20230 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
20240 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
20250 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
20260 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
20270 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
20280 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
20290 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
202a0 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
202b0 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
202c0 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
202d0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
202e0 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
202f0 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
20300 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
20310 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
20320 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
20330 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
20340 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
20350 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
20360 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
20370 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
20380 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
20390 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
203a0 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
203b0 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
203c0 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
203d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
203e0 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
203f0 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
20400 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
20410 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
20420 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
20430 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
20440 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
20450 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
20460 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
20470 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20480 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
20490 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
204a0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
204b0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
204c0 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
204d0 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
204e0 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
204f0 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
20500 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
20510 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
20520 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
20530 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
20540 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
20550 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
20560 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
20570 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
20580 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
20590 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
205a0 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
205b0 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
205c0 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
205d0 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
205e0 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
205f0 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
20600 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
20610 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
20620 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
20630 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
20640 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
20650 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
20660 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
20670 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
20680 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
20690 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
206a0 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
206b0 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
206c0 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
206d0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
206e0 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
206f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
20700 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
20710 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
20720 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
20730 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
20740 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20760 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
20770 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
20780 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
20790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
207a0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
207b0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
207c0 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
207d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
207e0 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
207f0 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
20800 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
20810 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20820 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
20830 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
20840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
20850 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
20860 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
20870 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
20880 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
20890 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
208a0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
208b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
208c0 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
208d0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
208e0 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
208f0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
20900 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
20910 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20920 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20940 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
20950 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
20960 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
20970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20980 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
20990 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
209a0 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
209b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
209c0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
209d0 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
209e0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
209f0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
20a00 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
20a10 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
20a20 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
20a30 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
20a40 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
20a50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
20a60 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
20a70 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
20a80 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
20a90 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
20aa0 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
20ab0 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
20ac0 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
20ad0 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
20ae0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
20af0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
20b00 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
20b10 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
20b20 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
20b30 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
20b40 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
20b50 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
20b60 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
20b70 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
20b80 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
20b90 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
20ba0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20bb0 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
20bc0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
20bd0 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
20be0 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
20bf0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
20c00 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
20c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20c20 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
20c30 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
20c40 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b  utex */.  u8 id;
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c60 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
20c70 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
20c80 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d  thin its unixShm
20c90 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68  Node */.  u16 sh
20ca0 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
20cb0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20cc0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
20cd0 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
20ce0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
20cf0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
20d00 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
20d10 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  d */.};../*.** C
20d20 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
20d30 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
20d40 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
20d50 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
20d60 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
20d70 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
20d80 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
20d90 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  fine UNIX_SHM_DM
20da0 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42  S    (UNIX_SHM_B
20db0 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
20dc0 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
20dd0 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
20de0 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
20df0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
20e00 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
20e10 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
20e20 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
20e30 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
20e40 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
20e50 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
20e60 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
20e70 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
20e80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20e90 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
20ea0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
20eb0 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c  ShmNode, /* Appl
20ec0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
20ed0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
20ee0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
20ef0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
20f00 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
20f10 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
20f20 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
20f30 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
20f40 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
20f50 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
20f60 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
20f90 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
20fa0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
20fb0 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  k f;       /* Th
20fc0 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
20fd0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
20fe0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
20ff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
21000 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
21010 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
21020 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
21030 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21040 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
21050 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
21060 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
21070 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21080 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
21090 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
210a0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
210b0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
210c0 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
210d0 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
210e0 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
210f0 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
21100 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
21110 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
21120 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
21130 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53  =1 && n<SQLITE_S
21140 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
21150 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
21160 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  0 ){.    /* Init
21170 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
21180 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
21190 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
211a0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
211b0 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
211c0 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
211d0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
211e0 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
211f0 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
21200 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72  _len = n;..    r
21210 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
21220 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
21230 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
21240 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
21250 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
21260 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
21270 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
21280 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
21290 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
212a0 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
212b0 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
212c0 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
212d0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
212e0 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33  .  mask = ofst>3
212f0 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c  1 ? 0xffff : (1<
21300 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
21310 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
21320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21330 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
21340 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
21350 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
21360 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
21370 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
21380 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
21390 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
213a0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
213b0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
213c0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
213d0 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
213e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
213f0 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
21400 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
21410 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
21420 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
21430 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
21440 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
21450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21460 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
21470 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
21480 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
21490 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
214a0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
214b0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
214c0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
214d0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
214e0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
214f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
21500 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
21510 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
21520 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
21530 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
21540 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
21550 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
21560 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
21570 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
21580 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
21590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
215a0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
215b0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
215c0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
215d0 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
215e0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
215f0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
21600 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
21610 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
21620 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
21630 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
21640 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
21650 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
21660 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
21670 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65      .}../*.** Re
21680 74 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20  turn the system 
21690 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  page size..*/.st
216a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
216b0 50 61 67 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a  Pagesize(void){.
216c0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 42 53 44  #if defined(_BSD
216d0 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74 75 72  _SOURCE).  retur
216e0 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28 29 3b  n getpagesize();
216f0 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
21700 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53 43  (int)sysconf(_SC
21710 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64  _PAGESIZE);.#end
21720 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
21730 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e  rn the minimum n
21740 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68  umber of 32KB sh
21750 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73  m regions that s
21760 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20  hould be mapped 
21770 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73  at.** a time, as
21780 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68  suming that each
21790 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
217a0 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
217b0 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  iple of the.** c
217c0 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61  urrent system pa
217d0 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55  ge-size..**.** U
217e0 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
217f0 31 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  1. The exception
21800 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73   seems to be sys
21810 74 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f  tems that are co
21820 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75  nfigured.** to u
21830 73 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20  se 64KB pages - 
21840 69 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63  in this case eac
21850 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63  h mapping must c
21860 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77  over at least tw
21870 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73  o.** shm regions
21880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21890 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
218a0 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  Map(void){.  int
218b0 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34   shmsz = 32*1024
218c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
218d0 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20  SHM region size 
218e0 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
218f0 75 6e 69 78 47 65 74 50 61 67 65 73 69 7a 65 28  unixGetPagesize(
21900 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70  );   /* System p
21910 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73  age size */.  as
21920 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26  sert( ((pgsz-1)&
21930 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a  pgsz)==0 );   /*
21940 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   Page size must 
21950 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
21960 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68  */.  if( pgsz<sh
21970 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  msz ) return 1;.
21980 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68    return pgsz/sh
21990 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  msz;.}../*.** Pu
219a0 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
219b0 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
219c0 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
219d0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
219e0 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
219f0 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
21a00 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
21a10 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
21a20 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
21a30 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
21a40 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
21a50 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
21a60 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
21a70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
21a80 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
21a90 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
21aa0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
21ab0 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
21ac0 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
21ad0 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
21ae0 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72  .    int nShmPer
21af0 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67  Map = unixShmReg
21b00 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20  ionPerMap();.   
21b10 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
21b20 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70  rt( p->pInode==p
21b30 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
21b40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
21b50 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
21b60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
21b70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53  ->nRegion; i+=nS
21b80 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20  hmPerMap){.     
21b90 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
21ba0 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
21bb0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
21bc0 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
21bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21be0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21bf0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29  (p->apRegion[i])
21c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21c10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21c20 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20  (p->apRegion);. 
21c30 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
21c40 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
21c50 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20  lose(pFd, p->h, 
21c60 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
21c70 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20   p->h = -1;.    
21c80 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  }.    p->pInode-
21c90 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
21ca0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21cb0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
21cc0 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d   Open a shared-m
21cd0 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
21ce0 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20  iated with open 
21cf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
21d00 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70  bFd.  .** This p
21d10 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d  articular implem
21d20 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d  entation uses mm
21d30 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  apped files..**.
21d40 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64  ** The file used
21d50 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68   to implement sh
21d60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69  ared-memory is i
21d70 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
21d80 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f  tory.** as the o
21d90 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
21da0 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  e and has the sa
21db0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
21dc0 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
21dd0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d  file with the "-
21de0 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65  shm" suffix adde
21df0 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  d.  For example,
21e00 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
21e10 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f   file.** is "/ho
21e20 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
21e30 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c  db" then the fil
21e40 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  e that is create
21e50 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a  d and mmapped.**
21e60 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
21e70 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ry will be calle
21e80 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  d "/home/user1/c
21e90 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20  onfig.db-shm".  
21ea0 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61  .**.** Another a
21eb0 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f  pproach to is to
21ec0 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64   use files in /d
21ed0 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74  ev/shm or /dev/t
21ee0 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65  mp or an.** some
21ef0 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75   other tmpfs mou
21f00 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c  nt. But if a fil
21f10 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  e in a different
21f20 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72   directory.** fr
21f30 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
21f40 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68  file is used, th
21f50 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63  en differing acc
21f60 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  ess permissions.
21f70 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29  ** or a chroot()
21f80 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f   might cause two
21f90 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
21fa0 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sses on the same
21fb0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20  .** database to 
21fc0 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66  end up using dif
21fd0 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72  ferent files for
21fe0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d   shared memory -
21ff0 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61   .** meaning tha
22000 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77  t their memory w
22010 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20  ould not really 
22020 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75  be shared - resu
22030 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61  lting.** in data
22040 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
22050 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
22060 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20  this tmpfs file 
22070 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20  usage.** can be 
22080 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
22090 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44  le-time using -D
220a0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
220b0 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a  TORY="/dev/shm".
220c0 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61  ** or the equiva
220d0 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f  lent.  The use o
220e0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  f the SQLITE_SHM
220f0 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
22100 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f  le-time.** optio
22110 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  n results in an 
22120 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69  incompatible bui
22130 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62  ld of SQLite;  b
22140 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a  uilds of SQLite.
22150 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66  ** that with dif
22160 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48  fering SQLITE_SH
22170 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74  M_DIRECTORY sett
22180 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ings attempt to 
22190 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  use the.** same 
221a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
221b0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
221c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
221d0 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  ion will likely.
221e0 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53  ** result. The S
221f0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
22200 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
22210 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69   option is consi
22220 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70  dered.** "unsupp
22230 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67  orted" and may g
22240 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75  o away in a futu
22250 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73  re SQLite releas
22260 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
22270 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
22280 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
22290 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
222a0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
222b0 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
222c0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
222d0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
222e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
222f0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
22300 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
22310 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
22320 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
22330 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
22340 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67  *.** If the orig
22350 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
22360 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73  le (pDbFd) is us
22370 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78  ing the "unix-ex
22380 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20  cl" VFS.** that 
22390 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78  means that an ex
223a0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
223b0 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
223c0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a  base file and.**
223d0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
223e0 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c  rocesses are abl
223f0 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
22400 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  te the database.
22410 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73    In.** that cas
22420 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61  e, we do not rea
22430 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20  lly need shared 
22440 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72  memory.  No shar
22450 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c  ed memory.** fil
22460 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
22470 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
22480 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74   will be simulat
22490 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d  ed with heap mem
224a0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
224b0 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65  nt unixOpenShare
224c0 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65  dMemory(unixFile
224d0 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
224e0 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  ct unixShm *p = 
224f0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
22500 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
22510 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
22520 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
22530 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
22540 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
22550 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
22560 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
22590 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  de */.  unixInod
225a0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
225b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
225c0 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20  node of fd */.  
225d0 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61  char *zShmFilena
225e0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
225f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
22600 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d  ile used for SHM
22610 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69   */.  int nShmFi
22620 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
22630 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22640 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d   the SHM filenam
22650 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
22660 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
22670 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  ce for the new u
22680 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a  nixShm object. *
22690 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  /.  p = sqlite3_
226a0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
226b0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
226c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
226d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
226e0 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
226f0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ));.  assert( pD
22700 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  bFd->pShm==0 );.
22710 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
22720 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e  ee if a unixShmN
22730 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61  ode object alrea
22740 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65  dy exists. Reuse
22750 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
22760 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74  * one if present
22770 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f  . Create a new o
22780 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
22790 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
227a0 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
227b0 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
227c0 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
227d0 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
227e0 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
227f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
22800 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22820 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
22830 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
22840 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c   */..    /* Call
22850 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75   fstat() to figu
22860 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69  re out the permi
22870 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61  ssions on the da
22880 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
22890 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73      ** a new *-s
228a0 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  hm file is creat
228b0 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77  ed, an attempt w
228c0 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63  ill be made to c
228d0 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  reate it.    ** 
228e0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65  with the same pe
228f0 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  rmissions..    *
22900 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
22910 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
22920 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62  at) && pInode->b
22930 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
22940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22950 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
22960 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
22970 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
22980 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
22990 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
229a0 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
229b0 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
229c0 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
229d0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
229e0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
229f0 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46  (int)strlen(pDbF
22a00 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69  d->zPath);.#endi
22a10 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
22a20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
22a30 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
22a40 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  e) + nShmFilenam
22a50 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  e );.    if( pSh
22a60 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
22a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22a80 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
22a90 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
22aa0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
22ab0 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
22ac0 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53  of(*pShmNode)+nS
22ad0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
22ae0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   zShmFilename = 
22af0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
22b00 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ame = (char*)&pS
22b10 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65  hmNode[1];.#ifde
22b20 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
22b30 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74  ECTORY.    sqlit
22b40 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
22b50 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
22b60 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
22b80 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22b90 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d  RY "/sqlite-shm-
22ba0 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x-%x",.        
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
22bc0 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20  2)sStat.st_ino, 
22bd0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65  (u32)sStat.st_de
22be0 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  v);.#else.    sq
22bf0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22c00 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
22c10 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  mFilename, "%s-s
22c20 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
22c30 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
22c40 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
22c50 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
22c60 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
22c70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
22c80 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
22c90 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
22ca0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
22cb0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
22cc0 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
22cd0 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
22ce0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
22cf0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
22d00 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
22d10 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
22d20 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
22d30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22d40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
22d50 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
22d60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22d70 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
22d80 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
22d90 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
22da0 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
22db0 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  T;.      if( sql
22dc0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
22dd0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
22de0 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
22df0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  ) ){.        ope
22e00 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
22e10 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  Y;.        pShmN
22e20 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
22e30 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
22e40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
22e50 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
22e60 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46  mFilename, openF
22e70 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f  lags, (sStat.st_
22e80 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20  mode&0777));.   
22e90 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
22ea0 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
22eb0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
22ec0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
22ed0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
22ee0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
22ef0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f         goto shm_
22f00 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  open_err;.      
22f10 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
22f20 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72  his process is r
22f30 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20  unning as root, 
22f40 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
22f50 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20  he SHM file.    
22f60 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79    ** is owned by
22f70 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74   the same user t
22f80 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69  hat owns the ori
22f90 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20  ginal database. 
22fa0 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
22fb0 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
22fc0 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74  l owner will not
22fd0 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e   be able to conn
22fe0 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ect..      */.  
22ff0 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 70 53 68      osFchown(pSh
23000 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e  mNode->h, sStat.
23010 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74  st_uid, sStat.st
23020 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20  _gid);.  .      
23030 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
23040 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
23050 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
23060 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
23070 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
23080 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
23090 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
230a0 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
230b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
230c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
230d0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
230e0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
230f0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
23100 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
23110 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
23120 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
23130 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
23140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23150 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
23160 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
23170 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65  OPEN, "ftruncate
23180 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
23190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
231a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
231b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
231c0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
231d0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
231e0 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
231f0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
23200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23210 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
23220 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23230 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
23240 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
23250 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
23260 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
23270 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
23280 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
23290 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
232a0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
232b0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
232c0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
232d0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
232e0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
232f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23300 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
23310 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
23320 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
23330 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
23340 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
23350 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
23360 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
23370 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
23380 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
23390 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
233a0 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
233b0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
233c0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
233d0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
233e0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
233f0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
23400 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
23410 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
23420 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
23430 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
23440 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
23450 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
23460 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
23470 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
23480 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
23490 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
234a0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
234b0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
234c0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
234d0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
234e0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
234f0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23500 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
23510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23520 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
23530 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
23540 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
23550 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
23560 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
23570 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
23580 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
23590 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
235a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
235b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
235c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
235d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
235e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
235f0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23600 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
23610 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
23620 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
23630 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
23640 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
23650 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
23660 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
23670 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
23680 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
23690 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
236a0 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
236b0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
236c0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
236d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
236e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
236f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
23700 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23710 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23720 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
23730 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
23740 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
23750 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
23760 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
23770 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
23780 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
23790 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
237a0 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
237b0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
237c0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
237d0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
237e0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
237f0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
23800 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
23810 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
23820 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
23830 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
23840 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
23850 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
23860 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
23870 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
23880 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
23890 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
238a0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
238b0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
238c0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
238d0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
238e0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
238f0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
23900 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
23910 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
23920 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23930 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
23940 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
23950 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
23960 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
23970 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
23980 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
23990 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
239a0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
239b0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
239c0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
239d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
239e0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a00 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
23a10 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
23a20 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
23a30 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23a40 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
23a50 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
23a80 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
23a90 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
23aa0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
23ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23ac0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
23ad0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23ae0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23af0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
23b00 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
23b10 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
23b20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23b30 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
23b40 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
23b50 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
23b60 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
23b70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
23b80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
23b90 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23ba0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
23bb0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
23bc0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23bd0 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
23be0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23bf0 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
23c00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23c10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23c20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
23c30 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
23c40 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
23c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23c60 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23c70 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
23c80 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
23c90 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
23ca0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
23cb0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23cc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
23cd0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
23ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23cf0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
23d00 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
23d10 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
23d20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23d30 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
23d40 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
23d50 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
23d60 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
23d70 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
23d80 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
23d90 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
23da0 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
23db0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
23dc0 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
23dd0 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
23de0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
23df0 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
23e00 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
23e10 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
23e20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
23e30 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
23e40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
23e50 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
23e60 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
23e70 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
23e80 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
23e90 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
23ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23eb0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
23ec0 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
23ed0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
23ee0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
23ef0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
23f00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
23f10 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
23f20 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
23f30 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
23f40 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
23f50 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
23f60 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
23f70 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
23f80 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
23f90 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
23fa0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
23fb0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
23fc0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
23fd0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
23fe0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
23ff0 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
24000 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
24010 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24020 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
24030 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
24040 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24050 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
24060 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
24070 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
24080 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
24090 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
240a0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
240b0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
240c0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
240d0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
240e0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
240f0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
24100 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24110 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24120 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
24130 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
24140 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24150 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
24160 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
24170 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
24180 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
24190 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
241a0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
241b0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
241c0 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
241d0 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
241e0 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
241f0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
24200 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
24210 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
24220 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
24230 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
24240 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
24250 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
24260 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
24270 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
24280 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
24290 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
242a0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
242b0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
242c0 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
242d0 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
242e0 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
242f0 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
24300 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
24310 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
24320 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
24330 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
24340 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
24350 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
24360 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
24370 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
24380 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
24390 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
243a0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
243b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
243c0 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
243d0 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
243e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
243f0 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
24400 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
24410 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
24420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
24430 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  ( seekAndWriteFd
24440 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50  (pShmNode->h, iP
24450 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c  g*pgsz + pgsz-1,
24460 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b   "", 1, 0)!=1 ){
24470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24480 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
24490 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
244a0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  lename;.        
244b0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
244c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
244d0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77  OERR_SHMSIZE, "w
244e0 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  rite", zFile);. 
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
24500 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24510 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24530 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24540 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
24550 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
24560 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
24570 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
24580 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
24590 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72     apNew = (char
245a0 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
245b0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
245c0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c  mNode->apRegion,
245d0 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65   nReqRegion*size
245e0 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29  of(char *).    )
245f0 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
24600 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
24610 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24620 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
24630 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
24640 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
24650 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
24660 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
24670 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
24680 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
24690 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52    int nMap = szR
246a0 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70  egion*nShmPerMap
246b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
246c0 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
246d0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
246e0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
246f0 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d       pMem = osMm
24700 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20  ap(0, nMap,.    
24710 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
24720 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
24730 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
24740 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
24750 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
24760 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
24770 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
24780 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
24790 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
247a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
247b0 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
247c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
247d0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
247e0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
247f0 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
24800 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
24810 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24820 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
24830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24840 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
24850 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
24860 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  c(szRegion);.   
24870 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
24880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
24890 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
248a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
248b0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
248c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
248d0 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
248e0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
248f0 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
24900 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20  ; i<nShmPerMap; 
24910 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
24920 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
24930 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
24940 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a  on+i] = &((char*
24950 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a  )pMem)[szRegion*
24960 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
24970 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
24980 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61  ion += nShmPerMa
24990 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  p;.    }.  }..sh
249a0 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
249b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
249c0 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
249d0 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
249e0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
249f0 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
24a00 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
24a10 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
24a20 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
24a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
24a40 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
24a50 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
24a60 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
24a70 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
24a80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24a90 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
24aa0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
24ab0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
24ac0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
24ad0 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
24ae0 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
24af0 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
24b00 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
24b10 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
24b20 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
24b30 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
24b40 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
24b50 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
24b60 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
24b70 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
24b80 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
24b90 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
24ba0 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
24bb0 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
24bc0 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
24bd0 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
24be0 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
24bf0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
24c00 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
24c10 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
24c20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
24c30 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
24c40 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
24c50 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
24c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24c70 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
24c80 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
24c90 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
24cc0 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
24cd0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
24ce0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
24cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
24d00 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
24d10 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
24d20 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
24d30 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
24d40 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
24d50 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
24d60 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
24d70 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
24d80 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
24d90 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
24da0 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
24db0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
24dc0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24de0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
24df0 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
24e00 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
24e10 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
24e20 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
24e30 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
24e40 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
24e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
24e80 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24eb0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
24ec0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
24ed0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
24ee0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
24ef0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
24f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24f10 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
24f20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
24f30 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
24f40 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
24f50 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
24f60 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
24f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
24f80 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
24f90 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
24fa0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
24fb0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
24fc0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
24fd0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
24fe0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
24ff0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
25000 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
25010 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
25020 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
25030 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
25040 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
25050 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
25060 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
25070 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25080 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
25090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
250a0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
250b0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
250c0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
250d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
250e0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
250f0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
25100 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
25110 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
25120 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
25130 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
25140 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
25150 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
25160 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
25170 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
25180 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
25190 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
251a0 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
251b0 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
251c0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
251d0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
251e0 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
251f0 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
25200 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
25210 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25220 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25230 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25240 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
25250 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25260 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
25270 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
25280 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
25290 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
252a0 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
252b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
252c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
252d0 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
252e0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
252f0 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
25300 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
25310 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
25320 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
25330 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  e, F_UNLCK, ofst
25340 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
25350 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
25360 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25370 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
25380 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
25390 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
253a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
253b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
253c0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
253d0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
253e0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
253f0 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
25400 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
25410 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
25420 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
25430 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
25440 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
25450 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
25460 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
25470 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
25480 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
25490 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
254a0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
254b0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
254c0 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
254d0 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
254e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
254f0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
25500 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
25510 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
25520 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
25530 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
25540 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
25550 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
25560 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
25570 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
25580 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
25590 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
255a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
255b0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
255c0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
255d0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
255e0 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
255f0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
25600 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
25610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
25630 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
25640 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
25650 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25660 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
25670 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73  de, F_RDLCK, ofs
25680 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
25690 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
256a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
256b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
256c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
256d0 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
256e0 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
256f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
25710 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
25720 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
25730 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
25740 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
25750 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
25760 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
25770 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
25780 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
25790 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
257a0 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
257b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
257c0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
257d0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
257e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
257f0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
25800 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
25810 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
25820 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
25830 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25840 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
25850 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25860 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
25870 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
25880 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
25890 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
258a0 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
258b0 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
258c0 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
258d0 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
258e0 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
258f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
25910 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
25920 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
25930 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  WRLCK, ofst+UNIX
25940 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
25950 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25970 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
25980 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
25990 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
259a0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
259b0 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
259c0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
259d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
259e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
259f0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
25a00 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
25a10 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
25a20 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
25a30 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29   p->id, getpid()
25a40 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
25a50 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a   p->exclMask));.
25a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25a70 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
25a80 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
25a90 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
25aa0 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
25ab0 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
25ac0 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
25ad0 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
25ae0 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
25af0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
25b00 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
25b10 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
25b20 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
25b30 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
25b40 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
25b50 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b70 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
25b80 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
25b90 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
25ba0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
25bb0 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  (fd);.  unixEnte
25bc0 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78  rMutex();.  unix
25bd0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
25be0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
25bf0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
25c00 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
25c10 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
25c20 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
25c30 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
25c40 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
25c50 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65  here is no share
25c60 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d memory associa
25c70 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ted with the con
25c80 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69  nection then thi
25c90 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
25ca0 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
25cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25cc0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20  unixShmUnmap(.  
25cd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
25ce0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25cf0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
25d00 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
25d10 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
25d20 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
25d30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
25d40 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20  hared-memory if 
25d50 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  true */.){.  uni
25d60 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  xShm *p;        
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d80 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
25d90 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
25da0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
25db0 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
25dc0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
25dd0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
25de0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
25df0 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
25e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
25e10 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
25e20 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
25e30 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  ns */.  unixFile
25e40 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20   *pDbFd;        
25e50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
25e60 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
25e70 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44  se file */..  pD
25e80 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
25e90 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
25ea0 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
25eb0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
25ec0 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
25ed0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
25ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
25ef0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
25f00 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
25f10 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
25f20 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
25f30 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20  Fd->pInode );.. 
25f40 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
25f50 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
25f60 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
25f70 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
25f80 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
25f90 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
25fa0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
25fb0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
25fc0 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
25fd0 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
25fe0 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
25ff0 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
26000 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
26010 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
26020 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
26030 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
26040 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
26050 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
26060 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
26070 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
26080 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
26090 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
260a0 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
260b0 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
260c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
260d0 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45  , too */.  unixE
260e0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
260f0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
26100 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68  >nRef>0 );.  pSh
26110 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  mNode->nRef--;. 
26120 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
26130 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref==0 ){.    if
26140 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20  ( deleteFlag && 
26150 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
26160 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f   osUnlink(pShmNo
26170 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
26180 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
26190 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
261a0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
261b0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
261c0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
261d0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
261e0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
261f0 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
26200 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
26210 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
26220 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
26230 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
26240 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
26250 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
26260 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
26270 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49  P_SIZE>0./*.** I
26280 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
26290 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c  y memory mapped,
262a0 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e   unmap file pFd.
262b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
262c0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
262d0 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
262e0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
262f0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
26300 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
26310 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d  on ){.    osMunm
26320 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  ap(pFd->pMapRegi
26330 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  on, pFd->mmapSiz
26340 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46  eActual);.    pF
26350 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
26360 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
26370 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
26380 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26390 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
263a0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
263b0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
263c0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
263d0 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  g maintained by 
263e0 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
263f0 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20  tor pFd to nNew 
26400 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74  bytes. Any exist
26410 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64  ing mapping is d
26420 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  iscarded..**.** 
26430 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
26440 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
26450 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
26460 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
26470 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
26480 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20  pMapRegion.**   
26490 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
264a0 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75  pSize.**       u
264b0 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
264c0 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20  Actual.**.** If 
264d0 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  unsuccessful, an
264e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
264f0 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c  s logged via sql
26500 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a  ite3_log() and.*
26510 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  * the three vari
26520 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20  ables above are 
26530 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20  zeroed. In this 
26540 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75  case SQLite shou
26550 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  ld.** continue a
26560 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
26570 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
26580 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69  xRead() and xWri
26590 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e  te().** methods.
265a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
265b0 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20  unixRemapfile(. 
265c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20   unixFile *pFd, 
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
265f0 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tor object */.  
26600 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20  i64 nNew        
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70  /* Required mapp
26630 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ing size */.){. 
26640 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
26650 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e  r = "mmap";.  in
26660 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20  t h = pFd->h;   
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26680 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
26690 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62  iptor open on db
266a0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70   file */.  u8 *p
266b0 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64  Orig = (u8 *)pFd
266c0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20  ->pMapRegion;   
266d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
266e0 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69  rrent file mappi
266f0 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69  ng */.  i64 nOri
26700 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  g = pFd->mmapSiz
26710 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20  eActual;     /* 
26720 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65  Size of pOrig re
26730 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  gion in bytes */
26740 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b  .  u8 *pNew = 0;
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
26770 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ion of new mappi
26780 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ng */.  int flag
26790 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20  s = PROT_READ;  
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
267b0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
267c0 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73   mmap() */..  as
267d0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
267e0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
267f0 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d  ert( nNew>pFd->m
26800 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
26810 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e  ert( nNew<=pFd->
26820 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20  mmapSizeMax );. 
26830 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
26840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  );.  assert( pFd
26850 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
26860 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  >=pFd->mmapSize 
26870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50  );.  assert( MAP
26880 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 20  _FAILED!=0 );.. 
26890 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
268a0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
268b0 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
268c0 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
268d0 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29  ;..  if( pOrig )
268e0 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  {.#if HAVE_MREMA
268f0 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  P.    i64 nReuse
26900 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
26910 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73  ;.#else.    cons
26920 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20  t int szSyspage 
26930 3d 20 75 6e 69 78 47 65 74 50 61 67 65 73 69 7a  = unixGetPagesiz
26940 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65  e();.    i64 nRe
26950 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70  use = (pFd->mmap
26960 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61  Size & ~(szSyspa
26970 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ge-1));.#endif. 
26980 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
26990 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
269a0 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
269b0 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
269c0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
269d0 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
269e0 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
269f0 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
26a00 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
26a10 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
26a20 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
26a30 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
26a40 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
26a50 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
26a60 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
26a70 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
26a80 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
26a90 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
26aa0 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
26ab0 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
26ac0 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
26ad0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
26ae0 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
26af0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
26b00 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
26b10 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
26b20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
26b30 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
26b40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26b50 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
26b60 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
26b70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
26b80 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
26b90 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
26ba0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
26bb0 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
26bc0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
26bd0 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
26be0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
26bf0 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
26c00 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
26c10 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
26c20 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
26c30 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
26c40 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
26c50 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
26c60 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
26c70 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
26c80 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
26c90 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
26ca0 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
26cb0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
26cc0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
26cd0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
26ce0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
26cf0 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
26d00 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
26d10 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
26d20 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
26d30 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
26d40 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
26d50 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
26d60 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
26d70 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
26d80 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
26d90 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
26da0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
26db0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
26dc0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
26dd0 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
26de0 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
26df0 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
26e00 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
26e10 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
26e20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
26e30 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
26e40 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
26e50 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
26e60 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
26e70 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
26e80 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
26e90 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
26ea0 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
26eb0 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
26ec0 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
26ed0 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
26ee0 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
26ef0 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
26f00 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
26f10 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
26f20 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
26f30 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
26f40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
26f50 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
26f60 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
26f70 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
26f80 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
26f90 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
26fa0 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
26fb0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
26fc0 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
26fd0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
26fe0 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
26ff0 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
27000 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
27010 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
27020 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
27030 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
27040 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
27050 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
27060 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
27070 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
27080 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
27090 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
270a0 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
270b0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
270c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
270d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
270e0 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
270f0 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
27100 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
27110 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
27120 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
27130 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
27140 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
27150 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
27160 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
27170 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
27180 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20 6e   nByte){.  i64 n
27190 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69  Map = nByte;.  i
271a0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
271b0 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
271c0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
271d0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
271e0 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
271f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
27200 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
27210 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
27220 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
27230 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
27240 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
27250 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
27260 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62  t(pFd->h, &statb
27270 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
27280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
272a0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
272b0 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20     }.    nMap = 
272c0 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b  statbuf.st_size;
272d0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
272e0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
272f0 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
27300 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
27310 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70  .  }..  if( nMap
27320 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
27330 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e  ){.    if( nMap>
27340 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52  0 ){.      unixR
27350 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d  emapfile(pFd, nM
27360 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ap);.    }else{.
27370 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
27380 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a  ile(pFd);.    }.
27390 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
273a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
273b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
273c0 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
273d0 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
273e0 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
273f0 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
27400 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
27410 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
27420 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
27430 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
27440 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
27450 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
27460 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
27470 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
27480 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
27490 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
274a0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
274b0 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
274c0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
274d0 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
274e0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
274f0 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
27500 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
27510 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
27520 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
27530 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
27540 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
27550 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
27560 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
27570 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
27580 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
27590 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
275a0 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
275b0 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73  ually .** releas
275c0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
275d0 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55  by calling unixU
275e0 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61  nfetch()..*/.sta
275f0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63  tic int unixFetc
27600 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
27610 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
27620 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
27630 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
27640 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
27650 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
27660 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
27670 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
27680 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
27690 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a  le */.#endif.  *
276a0 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c  pp = 0;..#if SQL
276b0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
276c0 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
276d0 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
276e0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
276f0 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
27700 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69      int rc = uni
27710 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  xMapfile(pFd, -1
27720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
27730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
27740 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27750 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
27760 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
27770 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
27780 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
27790 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
277a0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
277b0 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
277c0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
277d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
277e0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
277f0 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
27800 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
27810 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
27820 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
27830 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
27840 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
27850 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e   to unixFetch().
27860 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
27870 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
27880 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
27890 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
278a0 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
278b0 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
278c0 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
278d0 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74  d to the unixFet
278e0 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
278f0 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
27900 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
27910 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
27920 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27930 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
27940 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
27950 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
27960 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
27970 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
27980 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
27990 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
279a0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
279b0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
279c0 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63  c int unixUnfetc
279d0 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
279e0 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
279f0 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
27a00 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27a10 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
27a20 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
27a30 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
27a40 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
27a50 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53  e file */.  UNUS
27a60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66  ED_PARAMETER(iOf
27a70 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d  f);..  /* If p==
27a80 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
27a90 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
27aa0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
27ab0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
27ac0 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
27ad0 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
27ae0 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
27af0 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
27b00 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
27b10 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
27b20 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
27b30 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
27b40 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
27b50 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
27b60 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
27b70 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
27b80 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
27b90 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
27ba0 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
27bb0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
27bc0 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69  n)[iOff] );..  i
27bd0 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
27be0 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
27bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55  }else{.    unixU
27c00 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
27c10 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
27c20 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
27c30 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
27c40 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
27c50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27c60 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
27c70 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
27c80 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
27c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27ca0 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
27cb0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
27cc0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
27cd0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
27ce0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
27cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
27d00 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
27d10 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
27d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d30 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
27d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
27d90 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
27da0 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
27db0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27dc0 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
27dd0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
27de0 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
27df0 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
27e00 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
27e10 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
27e20 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
27e30 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
27e40 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
27e50 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
27e60 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
27e70 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27e80 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
27e90 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
27ea0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
27eb0 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
27ec0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
27ed0 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
27ee0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
27ef0 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
27f00 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
27f10 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
27f20 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
27f30 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
27f40 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
27f50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
27f60 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
27f70 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
27f80 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
27f90 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
27fa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
27fb0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
27fc0 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
27fd0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
27fe0 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
27ff0 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
28000 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
28010 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
28020 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
28030 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  funtion F, two o
28040 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
28050 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
28060 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
28070 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
28080 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
28090 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
280a0 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
280b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
280c0 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
280d0 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
280e0 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
280f0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
28100 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
28110 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
28120 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
28130 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
28140 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
28150 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
28160 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
28170 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
28180 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
28190 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
281a0 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
281b0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
281c0 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
281d0 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
281e0 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
281f0 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
28200 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
28210 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
28220 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
28230 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
28240 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
28250 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
28260 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
28270 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
28280 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
28290 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
282a0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
282b0 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
282c0 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
282d0 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
282e0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
282f0 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
28300 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
28310 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54  HODS(FINDER, MET
28320 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c  HOD, VERSION, CL
28330 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
28340 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
28350 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
28360 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28370 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
283a0 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
283f0 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28410 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28440 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28460 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28490 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
284b0 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
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 20 20 20 5c 0a 20 20 20             \.   
284e0 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
284f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28500 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
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 20 20 20 5c 0a 20 20 20 75            \.   u
28530 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
28540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28550 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28580 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
28590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
285a0 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
285d0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
285e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
285f0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
28620 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
28630 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
28640 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
28670 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
28680 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
28690 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
286c0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
286d0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
286e0 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
28710 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
28720 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
28730 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
28760 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
28770 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
28780 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61    \.   unixShmMa
287b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
287c0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
28800 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28810 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
28820 20 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 20 20 20                  
28840 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72  \.   unixShmBarr
28850 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
28860 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
28870 2a 2f 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 20 20 20 5c                 \
28890 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  .   unixShmUnmap
288a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
288b0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20  /* xShmUnmap */ 
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
288e0 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20     unixFetch,   
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28900 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20  * xFetch */     
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28930 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20    unixUnfetch,  
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28950 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20   xUnfetch */    
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 20 20 20 5c 0a 7d 3b              \.};
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 5c 0a 73 74 61             \.sta
289d0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
289e0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49  3_io_methods *FI
289f0 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74  NDER##Impl(const
28a00 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69   char *z, unixFi
28a10 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e  le *p){   \.  UN
28a20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
28a30 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ); UNUSED_PARAME
28a40 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20  TER(p);         
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74           \.  ret
28a70 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20  urn &METHOD;    
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 20 20 20 20 5c 0a 7d 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 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
28b10 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
28b20 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73  _methods *(*cons
28b30 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20  t FINDER)(const 
28b40 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a  char*,unixFile *
28b50 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49  p)    \.    = FI
28b60 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a  NDER##Impl;../*.
28b70 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20  ** Here are all 
28b80 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
28b90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28ba0 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  s for each of th
28bb0 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72  e.** locking str
28bc0 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69  ategies.  Functi
28bd0 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20  ons that return 
28be0 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73  pointers to thes
28bf0 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65  e methods.** are
28c00 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a   also created..*
28c10 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  /.IOMETHODS(.  p
28c20 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20  osixIoFinder,   
28c30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
28c40 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
28c50 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74   */.  posixIoMet
28c60 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
28c70 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
28c80 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
28c90 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20  e */.  3,       
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
28cc0 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65  y and mmap are e
28cd0 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  nabled */.  unix
28ce0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28cf0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
28d00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
28d10 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
28d20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
28d30 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55  ethod */.  unixU
28d40 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
28d50 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28d60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
28d70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28d80 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k     /* xCheckR
28d90 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
28da0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
28db0 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
28dc0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
28dd0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
28de0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
28df0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
28e00 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
28e10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28e20 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
28e50 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
28e60 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  led */.  nolockC
28e70 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
28e80 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
28e90 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c  hod */.  nolockL
28ea0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
28eb0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
28ec0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  od */.  nolockUn
28ed0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
28ee0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
28ef0 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  hod */.  nolockC
28f00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28f10 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
28f20 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
28f30 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
28f40 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
28f50 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  r,          /* F
28f60 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
28f70 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  ame */.  dotlock
28f80 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
28f90 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
28fa0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
28fb0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fd0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
28fe0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
28ff0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f   */.  dotlockClo
29000 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
29010 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29020 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63   */.  dotlockLoc
29030 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29040 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29050 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  */.  dotlockUnlo
29060 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck,            /
29070 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29080 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65   */.  dotlockChe
29090 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
290a0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
290b0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
290c0 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  )..#if SQLITE_EN
290d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
290e0 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
290f0 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66  S.IOMETHODS(.  f
29100 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
29110 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
29120 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29130 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74   */.  flockIoMet
29140 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
29150 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
29160 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
29170 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
291a0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
291b0 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20  .  flockClose,  
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
291d0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
291e0 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20  .  flockLock,   
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29200 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29210 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20    flockUnlock,  
29220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29230 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29240 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  .  flockCheckRes
29250 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20  ervedLock    /* 
29260 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29270 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
29280 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
29290 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
292a0 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292c0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
292d0 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
292e0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
292f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29300 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29310 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29340 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29350 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c  d */.  semClose,
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29380 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20  d */.  semLock, 
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
293b0 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c   */.  semUnlock,
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293d0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
293e0 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52  d */.  semCheckR
293f0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
29400 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29410 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29420 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
29430 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29440 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
29450 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29460 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66  .IOMETHODS(.  af
29470 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  pIoFinder,      
29480 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29490 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
294a0 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64  */.  afpIoMethod
294b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
294c0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
294d0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
294e0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
294f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29500 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29510 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29520 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
29530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29540 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29550 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
29560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29570 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29580 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
29590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
295a0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
295b0 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
295c0 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
295d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
295e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
295f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
29600 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65  proxy locking me
29610 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72  thod is a "super
29620 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20  -method" in the 
29630 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a  sense that it.**
29640 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79   opens secondary
29650 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
29660 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  s for the conch 
29670 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  and lock files a
29680 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72  nd.** it uses pr
29690 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41  oxy, dot-file, A
296a0 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20  FP, and flock() 
296b0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
296c0 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f  on those.** seco
296d0 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f  ndary files.  Fo
296e0 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  r this reason, t
296f0 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
29700 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70   implements.** p
29710 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
29720 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72  located much fur
29730 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ther down in the
29740 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e   file.  But we n
29750 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65  eed.** to go ahe
29760 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68  ad and define th
29770 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
29780 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20  hods and finder 
29790 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
297a0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65  proxy locking he
297b0 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61  re.  So we forwa
297c0 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49  rd declare the I
297d0 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23  /O methods..*/.#
297e0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
297f0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29800 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29810 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20  TYLE.static int 
29820 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
29830 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
29840 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
29850 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
29860 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
29870 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69  proxyUnlock(sqli
29880 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
29890 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
298a0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
298b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
298c0 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f  , int*);.IOMETHO
298d0 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e  DS(.  proxyIoFin
298e0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
298f0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
29900 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f  on name */.  pro
29910 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  xyIoMethods,    
29920 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
29930 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29940 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
29950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29960 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29970 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29980 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  bled */.  proxyC
29990 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
299a0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
299b0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  thod */.  proxyL
299c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
299d0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
299e0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e  hod */.  proxyUn
299f0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29a00 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
29a10 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  thod */.  proxyC
29a20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29a30 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
29a40 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
29a50 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
29a60 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
29a70 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
29a80 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
29a90 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
29aa0 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
29ab0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
29ac0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
29ad0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29ae0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
29af0 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
29b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29b10 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
29b20 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
29b30 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
29b40 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29b50 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29b60 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29b90 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29ba0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
29bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bc0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
29bd0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
29be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bf0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
29c00 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
29c10 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29c20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
29c30 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
29c40 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29c50 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29c60 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29c70 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
29c80 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
29c90 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29ca0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29cb0 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
29cc0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
29cd0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
29ce0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
29cf0 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
29d00 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
29d10 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
29d20 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
29d30 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
29d40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29d50 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
29d60 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
29d70 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
29d80 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f  This is for MacO
29d90 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  SX only..*/.stat
29da0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29db0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
29dc0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
29dd0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
29de0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
29df0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
29e00 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
29e10 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
29e20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e           /* open
29e30 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72   file object for
29e40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29e50 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
29e60 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
29e70 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
29e80 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
29e90 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
29ea0 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
29eb0 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
29ec0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
29ed0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
29ee0 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
29ef0 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
29f00 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
29f10 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
29f20 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
29f30 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
29f40 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
29f50 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
29f60 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
29f70 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
29f80 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26     { "smbfs",  &
29f90 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
29fa0 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20      { "webdav", 
29fb0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
29fc0 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d   },.    { 0, 0 }
29fd0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
29fe0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
29ff0 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  sInfo;.  struct 
2a000 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2a010 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2a020 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2a030 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2a040 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2a050 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2a060 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2a070 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2a080 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2a090 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2a0a0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2a0b0 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ods;.  }.  if( s
2a0c0 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20  tatfs(filePath, 
2a0d0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29  &fsInfo) != -1 )
2a0e0 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f  {.    if( fsInfo
2a0f0 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
2a100 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72  DONLY ){.      r
2a110 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2a120 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2a130 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b    for(i=0; aMap[
2a140 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  i].zFilesystem; 
2a150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2a160 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2a170 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70  fstypename, aMap
2a180 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29  [i].zFilesystem)
2a190 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2a1a0 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d  eturn aMap[i].pM
2a1b0 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a  ethods;.      }.
2a1c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a1d0 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61  Default case. Ha
2a1e0 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f  ndles, amongst o
2a1f0 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20  thers, "nfs"..  
2a200 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e  ** Test byte-ran
2a210 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63  ge lock using fc
2a220 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61  ntl(). If the ca
2a230 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20  ll succeeds, .  
2a240 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
2a250 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2a260 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74  upports POSIX st
2a270 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f  yle locks. .  */
2a280 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
2a290 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
2a2a0 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
2a2b0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
2a2c0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
2a2d0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
2a2e0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
2a2f0 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
2a300 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
2a310 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
2a320 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
2a330 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2a340 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a  e, "nfs")==0 ){.
2a350 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66        return &nf
2a360 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  sIoMethods;.    
2a370 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
2a380 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2a390 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  thods;.    }.  }
2a3a0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2a3b0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2a3c0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2a3d0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a3e0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2a3f0 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2a400 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2a410 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2a420 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2a430 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2a440 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
2a450 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2a460 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a470 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56  YLE */..#if OS_V
2a480 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45  XWORKS && SQLITE
2a490 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a4a0 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
2a4b0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2a4c0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
2a4d0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
2a4e0 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
2a4f0 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
2a500 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
2a510 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
2a520 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
2a530 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a540 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
2a550 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
2a560 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
2a570 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58 57   This is for VXW
2a580 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  orks only..*/.st
2a590 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a5a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
2a5b0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2a5c0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2a5d0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2a5e0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2a5f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2a600 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2a610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
2a620 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  e open file obje
2a630 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
2a640 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2a650 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2a660 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2a670 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2a680 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2a690 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2a6a0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2a6b0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2a6c0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2a6d0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2a6e0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2a6f0 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  thods;.  }..  /*
2a700 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29   Test if fcntl()
2a710 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e   is supported an
2a720 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c  d use POSIX styl
2a730 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74  e locks..  ** Ot
2a740 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63  herwise fall bac
2a750 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73  k to the named s
2a760 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e  emaphore method.
2a770 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2a780 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2a790 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2a7a0 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2a7b0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2a7c0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2a7d0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2a7e0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2a7f0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2a800 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2a810 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
2a820 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2a830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2a840 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
2a850 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2a860 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a870 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2a880 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
2a890 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2a8a0 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2a8b0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2a8c0 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
2a8d0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53   OS_VXWORKS && S
2a8e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a8f0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
2a900 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
2a910 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
2a920 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68  ter to a IO meth
2a930 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
2a940 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
2a950 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a960 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
2a970 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
2a980 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
2a990 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
2aa00 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2aa10 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2aa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2aa30 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
2aa40 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
2aa50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2aa60 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
2aa70 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
2aa80 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
2aa90 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2aaa0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2aab0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2aac0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
2aad0 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
2aae0 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
2aaf0 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
2ab00 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
2ab10 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
2ab20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
2ab30 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2ab40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
2ab50 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
2ab60 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2ab70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2ab80 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
2ab90 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
2aba0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2abb0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2abc0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2abd0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
2abe0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2abf0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ned */.  int ctr
2ac00 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
2ac10 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
2ac20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75   UNIXFILE_* valu
2ac30 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
2ac40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ac50 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
2ac60 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
2ac70 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2ac80 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
2ac90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2aca0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
2acb0 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
2acc0 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65    /* Usually the
2acd0 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20   path zFilename 
2ace0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
2acf0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2ad00 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65  e. The.  ** exce
2ad10 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70  ption is when op
2ad20 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20  ening the proxy 
2ad30 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20  "conch" file in 
2ad40 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a  builds that.  **
2ad50 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65   include the spe
2ad60 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69  cial Apple locki
2ad70 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a  ng styles..  */.
2ad80 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2ad90 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2ada0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2adb0 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20  STYLE.  assert( 
2adc0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2add0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2ade0 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e  ' .    || pVfs->
2adf0 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a  pAppData==(void*
2ae00 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
2ae10 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73  er );.#else.  as
2ae20 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2ae30 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2ae40 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69  0]=='/' );.#endi
2ae50 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  f..  /* No locki
2ae60 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
2ae70 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
2ae80 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2ae90 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
2aea0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2aeb0 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
2aec0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2aed0 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2aee0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2aef0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2af00 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2af10 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2af20 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2af30 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2af40 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
2af50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2af60 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2af70 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2af80 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2af90 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2afa0 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2afb0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2afc0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2afd0 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2afe0 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2b010 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2b020 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2b030 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2b040 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2b050 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2b060 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2b070 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2b080 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2b090 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b0a0 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2b0b0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2b0c0 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2b0d0 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2b0e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2b0f0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2b100 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2b110 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2b120 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2b130 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
2b140 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
2b150 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2b160 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
2b170 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
2b180 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2b190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
2b1a0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
2b1b0 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
2b1c0 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
2b1d0 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
2b1e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2b1f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2b200 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
2b210 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
2b220 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
2b230 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
2b240 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
2b250 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
2b260 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
2b270 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
2b280 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
2b290 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
2b2a0 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
2b2b0 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
2b2c0 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
2b2d0 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
2b2e0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2b2f0 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
2b300 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
2b310 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
2b320 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
2b330 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
2b340 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2b350 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2b360 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b370 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
2b380 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
2b390 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
2b3a0 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
2b3b0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2b3c0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2b3d0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2b3e0 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
2b3f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b400 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
2b410 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2b420 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2b430 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2b440 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2b450 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2b460 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2b470 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2b480 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2b490 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2b4a0 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2b4b0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2b4c0 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2b4d0 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2b4e0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2b4f0 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2b500 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2b510 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2b520 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2b530 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2b540 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2b550 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2b560 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2b570 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2b580 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2b590 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2b5a0 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2b5b0 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2b5c0 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2b5d0 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2b5e0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2b5f0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2b600 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2b610 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2b620 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2b630 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2b640 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2b650 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2b660 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2b670 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2b680 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2b690 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2b6a0 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2b6b0 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2b6c0 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2b6d0 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2b6e0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2b6f0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2b700 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2b710 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2b720 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2b730 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2b740 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2b750 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2b760 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2b770 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2b780 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2b790 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2b7a0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2b7b0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2b7c0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2b7d0 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2b7e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b7f0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2b800 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2b810 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2b820 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2b830 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2b840 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2b850 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2b860 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2b870 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2b880 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2b890 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2b8a0 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2b8b0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2b8c0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2b8d0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2b8e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2b8f0 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
2b900 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2b910 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2b920 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b940 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
2b950 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
2b960 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2b970 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
2b980 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
2b990 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
2b9a0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
2b9b0 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
2b9c0 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
2b9d0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
2b9e0 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
2b9f0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
2ba00 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
2ba10 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
2ba20 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
2ba30 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
2ba40 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2ba50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
2ba60 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2ba70 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2ba80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ba90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2baa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bab0 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
2bac0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2bad0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2bae0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2baf0 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
2bb00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bb10 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2bb20 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
2bb30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
2bb40 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2bb50 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
2bb60 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2bb70 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
2bb80 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2bb90 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2bba0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2bbb0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2bbc0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
2bbd0 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
2bbe0 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
2bbf0 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
2bc00 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  name;.    assert
2bc10 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
2bc20 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
2bc30 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
2bc40 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
2bc50 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
2bc60 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2bc70 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  lloc(nFilename);
2bc80 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
2bc90 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
2bca0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2bcb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bcc0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2bcd0 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
2bce0 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
2bcf0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
2bd00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
2bd10 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2bd20 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
2bd30 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
2bd40 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
2bd50 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2bd60 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
2bd70 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
2bd80 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2bd90 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2bda0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2bdb0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2bdc0 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
2bdd0 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
2bde0 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
2bdf0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2be00 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2be10 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2be20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2be30 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
2be40 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
2be50 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
2be60 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
2be70 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
2be80 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2be90 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
2bea0 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
2beb0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
2bec0 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
2bed0 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
2bf00 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
2bf10 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
2bf20 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
2bf30 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
2bf40 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
2bf50 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
2bf60 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
2bf70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2bf80 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
2bf90 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
2bfa0 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
2bfb0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2bfc0 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
2bfd0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
2bfe0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2bff0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2c000 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30  node->aSemName[0
2c010 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
2c020 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2c030 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2c040 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e  }.#endif.  .  pN
2c050 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ew->lastErrno = 
2c060 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  0;.#if OS_VXWORK
2c070 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  S.  if( rc!=SQLI
2c080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2c090 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2c0a0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2c0b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d  LINE__);.    h =
2c0c0 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e   -1;.    osUnlin
2c0d0 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
2c0e0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2c0f0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
2c100 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  LETE;.  }.#endif
2c110 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2c130 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2c140 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2c150 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b  INE__);.  }else{
2c160 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
2c170 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79  od = pLockingSty
2c180 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  le;.    OpenCoun
2c190 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72  ter(+1);.    ver
2c1a0 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b  ifyDbFile(pNew);
2c1b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c1c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2c1d0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
2c1e0 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69  directory in whi
2c1f0 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72  ch to put tempor
2c200 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66  ary files..** If
2c210 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d   no suitable tem
2c220 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65  porary file dire
2c230 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75  ctory can be fou
2c240 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  nd, return NULL.
2c250 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2c260 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2c270 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20  ileDir(void){.  
2c280 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2c290 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
2c2a0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
2c2b0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
2c2c0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
2c2d0 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
2c2e0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20  /tmp",.     0   
2c2f0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72       /* List ter
2c300 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a  minator */.  };.
2c310 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2c320 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
2c330 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
2c340 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
2c350 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
2c360 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
2c370 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ry;.  if( !azDir
2c380 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
2c390 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
2c3a0 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66  E_TMPDIR");.  if
2c3b0 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
2c3c0 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
2c3d0 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66  v("TMPDIR");.  f
2c3e0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2c3f0 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
2c400 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
2c410 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
2c420 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29     if( zDir==0 )
2c430 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c440 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20  f( osStat(zDir, 
2c450 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  &buf) ) continue
2c460 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44  ;.    if( !S_ISD
2c470 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  IR(buf.st_mode) 
2c480 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c490 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69  if( osAccess(zDi
2c4a0 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  r, 07) ) continu
2c4b0 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;.    break;.  
2c4c0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b  }.  return zDir;
2c4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2c4e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2c4f0 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
2c500 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c   zBuf must be al
2c510 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
2c520 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73  e calling proces
2c530 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69  s and must be bi
2c540 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
2c550 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66   at least.** pVf
2c560 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  s->mxPathname by
2c570 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
2c580 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
2c590 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
2c5a0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
2c5b0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
2c5c0 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
2c5d0 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
2c5e0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
2c5f0 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
2c600 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
2c610 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
2c620 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64  789";.  unsigned
2c630 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e   int i, j;.  con
2c640 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a  st char *zDir;..
2c650 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
2c660 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
2c670 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
2c680 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
2c690 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
2c6a0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
2c6b0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
2c6c0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
2c6d0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
2c6e0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
2c6f0 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
2c700 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2c710 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
2c720 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69  );..  zDir = uni
2c730 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a  xTempFileDir();.
2c740 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
2c750 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
2c760 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2c770 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
2c780 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
2c790 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
2c7a0 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
2c7b0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
2c7c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2c7d0 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ROR..  */.  if( 
2c7e0 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20  (strlen(zDir) + 
2c7f0 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45  strlen(SQLITE_TE
2c800 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
2c810 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74  + 18) >= (size_t
2c820 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74  )nBuf ){.    ret
2c830 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2c840 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
2c850 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c860 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c  f(nBuf-18, zBuf,
2c870 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
2c880 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
2c890 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69  Dir);.    j = (i
2c8a0 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b  nt)strlen(zBuf);
2c8b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
2c8c0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
2c8d0 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
2c8e0 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
2c8f0 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
2c900 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
2c910 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
2c920 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
2c930 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
2c940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
2c950 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42 75  [j] = 0;.    zBu
2c960 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 77  f[j+1] = 0;.  }w
2c970 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a  hile( osAccess(z
2c980 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
2c990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c9a0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
2c9b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2c9c0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
2c9d0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
2c9e0 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
2c9f0 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
2ca00 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
2ca10 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
2ca20 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2ca30 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
2ca40 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
2ca50 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
2ca60 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
2ca70 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2ca80 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
2ca90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2caa0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2cab0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
2cac0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
2cad0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
2cae0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2caf0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2cb00 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
2cb10 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2cb20 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
2cb30 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
2cb40 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
2cb50 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
2cb60 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
2cb70 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
2cb80 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
2cb90 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
2cba0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2cbb0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
2cbc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2cbd0 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
2cbe0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
2cbf0 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
2cc00 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2cc10 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
2cc20 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
2cc30 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2cc40 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
2cc50 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
2cc60 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
2cc70 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
2cc80 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
2cc90 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
2cca0 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
2ccb0 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
2ccc0 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
2ccd0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
2cce0 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
2ccf0 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
2cd00 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
2cd10 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
2cd20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
2cd30 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
2cd40 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
2cd50 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
2cd60 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
2cd70 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2cd80 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
2cd90 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
2cda0 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
2cdb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2cdc0 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
2cdd0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2cde0 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
2cdf0 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
2ce00 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
2ce10 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
2ce20 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
2ce30 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
2ce40 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
2ce50 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
2ce60 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2ce70 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
2ce80 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
2ce90 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
2cea0 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
2ceb0 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
2cec0 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
2ced0 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
2cee0 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
2cef0 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
2cf00 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
2cf10 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
2cf20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
2cf30 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
2cf40 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
2cf50 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
2cf60 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
2cf70 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
2cf80 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2cf90 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
2cfc0 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
2cfd0 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
2cfe0 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
2cff0 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
2d000 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
2d010 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
2d020 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
2d030 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
2d040 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
2d050 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
2d060 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
2d070 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
2d080 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
2d090 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
2d0a0 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
2d0b0 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
2d0c0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
2d0d0 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
2d0e0 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
2d0f0 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
2d100 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2d110 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
2d120 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
2d130 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
2d140 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
2d150 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
2d160 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
2d170 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
2d180 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
2d190 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
2d1a0 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  susable file des
2d1b0 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
2d1c0 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
2d1d0 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2d1e0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2d1f0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
2d200 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
2d210 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d220 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
2d230 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
2d240 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
2d250 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
2d260 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d280 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
2d290 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
2d2a0 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2d2b0 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2d2c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2d2d0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2d2e0 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2d2f0 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2d300 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2d310 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2d320 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2d330 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2d340 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2d350 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2d360 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2d370 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
2d380 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2d390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d3a0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2d3b0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2d3c0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
2d3d0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
2d3e0 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
2d3f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d400 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
2d410 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
2d420 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
2d430 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
2d440 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
2d450 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
2d460 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2d470 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
2d480 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
2d490 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
2d4a0 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
2d4b0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2d4c0 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
2d4d0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2d4e0 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
2d4f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2d500 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2d510 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
2d520 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2d530 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
2d540 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
2d550 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 63   In most cases c
2d560 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2d570 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2d580 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2d590 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2d5a0 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2d5b0 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2d5c0 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2d5d0 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2d5e0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2d5f0 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2d600 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2d610 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2d620 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2d630 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2d640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2d650 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2d660 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2d670 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2d680 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2d690 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2d6a0 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2d6b0 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2d6c0 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2d6d0 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2d6e0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2d6f0 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2d700 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2d710 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2d720 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2d730 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2d740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2d750 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2d760 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2d770 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2d780 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2d790 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2d7a0 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2d7b0 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2d7c0 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2d7d0 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2d7e0 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2d7f0 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2d800 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2d810 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2d820 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2d830 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2d840 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2d850 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2d860 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2d870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2d880 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2d890 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2d8a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2d8b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2d8c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2d8d0 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2d8e0 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2d8f0 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2d900 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2d910 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d920 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2d930 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2d940 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d960 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2d970 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2d980 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2d990 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2d9a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2d9b0 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2d9c0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2d9d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d9e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d9f0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2da00 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2da10 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2da20 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2da30 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2da40 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2da50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2da60 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2da70 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2da80 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2da90 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2daa0 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dac0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2dad0 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2dae0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
2daf0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2db00 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2db10 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2db20 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2db30 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2db40 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2db50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2db60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2db70 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2db80 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2db90 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2dba0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2dbb0 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2dbc0 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2dbd0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2dbe0 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2dbf0 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2dc00 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2dc10 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2dc20 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2dc30 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2dc40 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2dc50 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
2dc60 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2dc70 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
2dc80 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
2dc90 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
2dca0 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
2dcb0 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
2dcc0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
2dcd0 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
2dce0 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
2dcf0 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
2dd00 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2dd10 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53  ) - 1; .#ifdef S
2dd20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2dd30 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65  _NAMES.    while
2dd40 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74  ( nDb>0 && sqlit
2dd50 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
2dd60 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20  nDb]) ) nDb--;. 
2dd70 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
2dd80 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2dd90 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2dda0 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77  _OK;.#else.    w
2ddb0 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
2ddc0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61  !='-' ){.      a
2ddd0 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a  ssert( nDb>0 );.
2dde0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50        assert( zP
2ddf0 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29  ath[nDb]!='\n' )
2de00 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20  ;.      nDb--;. 
2de10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2de20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
2de30 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
2de40 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
2de50 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
2de60 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
2de70 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
2de80 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2de90 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69  0777;.      *pUi
2dea0 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
2deb0 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20  ;.      *pGid = 
2dec0 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20  sStat.st_gid;.  
2ded0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2dee0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2def0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
2df00 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
2df10 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2df20 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
2df30 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
2df40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2df50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
2df60 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
2df70 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
2df80 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
2df90 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
2dfa0 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
2dfb0 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
2dfc0 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
2dfd0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2dfe0 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
2dff0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2e000 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
2e010 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
2e020 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
2e030 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
2e040 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
2e050 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
2e060 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
2e070 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
2e080 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
2e090 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2e0a0 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
2e0b0 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
2e0c0 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
2e0d0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
2e0e0 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
2e0f0 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
2e100 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
2e110 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2e120 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
2e130 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
2e140 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
2e150 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
2e160 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
2e170 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
2e180 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
2e190 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
2e1a0 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
2e1b0 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
2e1c0 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
2e1d0 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
2e1e0 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
2e1f0 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
2e200 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
2e210 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
2e220 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
2e230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2e240 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
2e250 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2e260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
2e270 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
2e280 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
2e290 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
2e2a0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2e2b0 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
2e2c0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2e2d0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2e2e0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2e2f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2e300 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e310 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
2e320 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e340 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
2e350 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
2e360 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
2e370 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
2e380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2e390 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
2e3a0 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
2e3b0 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
2e3c0 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
2e3d0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
2e3e0 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e400 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2e410 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
2e420 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  () */.  int open
2e430 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2e440 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2e450 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
2e460 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
2e470 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
2e480 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
2e490 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2e4a0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2e4d0 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
2e4e0 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
2e4f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2e500 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2e510 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
2e520 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
2e530 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
2e540 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45       /* UNIXFILE
2e550 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69  _* flags */..  i
2e560 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
2e570 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e580 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
2e590 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
2e5a0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
2e5b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2e5c0 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
2e5d0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
2e5e0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e5f0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
2e600 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2e610 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2e620 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e630 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
2e640 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
2e650 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2e660 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
2e670 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e680 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
2e690 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
2e6a0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e6b0 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
2e6c0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
2e6d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
2e6e0 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2e6f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2e700 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2e710 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Info;.#endif..  
2e720 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
2e730 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
2e740 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
2e750 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2e760 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
2e770 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
2e780 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
2e790 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
2e7a0 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
2e7b0 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
2e7c0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
2e7d0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
2e7e0 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
2e7f0 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
2e800 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28   int syncDir = (
2e810 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
2e820 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
2e830 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2e840 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
2e850 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e860 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2e870 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2e880 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2e890 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
2e8a0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
2e8b0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
2e8c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2e8d0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
2e8e0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
2e8f0 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
2e900 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
2e910 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
2e920 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
2e930 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
2e940 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f  ATHNAME+2];.  co
2e950 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2e960 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
2e970 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
2e980 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
2e990 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
2e9a0 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
2e9b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
2e9c0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
2e9d0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
2e9e0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
2e9f0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
2ea00 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
2ea10 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
2ea20 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
2ea30 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
2ea40 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
2ea50 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
2ea60 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
2ea70 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
2ea80 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
2ea90 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2eaa0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2eab0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
2eac0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
2ead0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
2eae0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
2eaf0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
2eb00 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
2eb10 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
2eb20 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
2eb30 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
2eb40 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
2eb50 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
2eb60 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
2eb70 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
2eb80 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
2eb90 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
2eba0 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
2ebb0 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
2ebc0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
2ebd0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
2ebe0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
2ebf0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
2ec00 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ec10 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2ec20 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2ec30 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
2ec40 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ec50 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2ec60 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2ec70 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
2ec80 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2ec90 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2eca0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2ecb0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2ecc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2ecd0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2ece0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2ecf0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
2ed00 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
2ed10 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
2ed20 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
2ed30 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
2ed40 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
2ed50 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
2ed60 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2ed70 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2ed80 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2ed90 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
2eda0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2edb0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
2edc0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2edd0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
2ede0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2edf0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
2ee00 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
2ee10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ee20 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2ee30 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2ee40 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2ee50 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
2ee60 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ee70 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  N_WAL.  );..  /*
2ee80 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68   Detect a pid ch
2ee90 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74  ange and reset t
2eea0 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20  he PRNG.  There 
2eeb0 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
2eec0 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75  ion.  ** here su
2eed0 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d  ch that two or m
2eee0 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ore threads all 
2eef0 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64  trying to open d
2ef00 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a  atabases at.  **
2ef10 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e   the same instan
2ef20 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65  t might all rese
2ef30 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74  t the PRNG.  But
2ef40 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73   multiple resets
2ef50 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65  .  ** are harmle
2ef60 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ss..  */.  if( r
2ef70 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 67 65  andomnessPid!=ge
2ef80 74 70 69 64 28 29 20 29 7b 0a 20 20 20 20 72 61  tpid() ){.    ra
2ef90 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 67 65  ndomnessPid = ge
2efa0 74 70 69 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  tpid();.    sqli
2efb0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30  te3_randomness(0
2efc0 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73  ,0);.  }..  mems
2efd0 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
2efe0 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69  unixFile));..  i
2eff0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
2f000 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
2f010 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46  .    UnixUnusedF
2f020 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20  d *pUnused;.    
2f030 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
2f040 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20  usableFd(zName, 
2f050 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
2f060 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2f070 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2f080 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
2f090 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
2f0a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2f0b0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
2f0c0 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73        if( !pUnus
2f0d0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
2f0e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f0f0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
2f100 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20  .    p->pUnused 
2f110 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20  = pUnused;..    
2f120 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2f130 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
2f140 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
2f150 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
2f160 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74  .    ** URIs wit
2f170 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
2f180 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
2f190 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
2f1a0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  into.    ** sqli
2f1b0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2f1c0 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2f1d0 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  rt( (flags & SQL
2f1e0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
2f1f0 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
2f200 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
2f210 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
2f220 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
2f230 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
2f240 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
2f250 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
2f260 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
2f270 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
2f280 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20  && !syncDir);.  
2f290 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65    rc = unixGetTe
2f2a0 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e  mpname(MAX_PATHN
2f2b0 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29  AME+2, zTmpname)
2f2c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f2d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f2e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f2f0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
2f300 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20  mpname;..    /* 
2f310 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72  Generated tempor
2f320 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ary filenames ar
2f330 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d  e always double-
2f340 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a  zero terminated.
2f350 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62      ** for use b
2f360 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  y sqlite3_uri_pa
2f370 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
2f380 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b    assert( zName[
2f390 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
2f3a0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
2f3b0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
2f3c0 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
2f3d0 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
2f3e0 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
2f3f0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
2f400 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
2f410 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
2f420 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
2f430 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
2f440 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
2f450 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
2f460 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
2f470 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
2f480 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
2f490 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
2f4a0 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
2f4b0 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
2f4c0 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
2f4d0 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
2f4e0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
2f4f0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2f500 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
2f510 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
2f520 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
2f530 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
2f540 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
2f550 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
2f560 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
2f570 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
2f580 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
2f590 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2f5a0 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b  mode_t openMode;
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f5c0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2f5d0 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68  create file with
2f5e0 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69   */.    uid_t ui
2f5f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2f600 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
2f610 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
2f620 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20      gid_t gid;  
2f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f640 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72    /* Groupid for
2f650 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
2f660 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
2f670 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
2f680 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
2f690 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20  , &uid, &gid);. 
2f6a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f6b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2f6c0 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65  sert( !p->pUnuse
2f6d0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
2f6e0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
2f6f0 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79  _OPEN_WAL || eTy
2f700 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f710 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
2f720 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f730 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20  .    }.    fd = 
2f740 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
2f750 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
2f760 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
2f770 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25  RACE(("OPENX   %
2f780 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
2f790 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
2f7a0 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ags));.    if( f
2f7b0 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
2f7c0 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
2f7d0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
2f7e0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
2f7f0 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
2f800 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
2f810 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
2f820 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
2f830 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20  .      flags &= 
2f840 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
2f850 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2f860 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
2f870 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20     openFlags &= 
2f880 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  ~(O_RDWR|O_CREAT
2f890 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  );.      flags |
2f8a0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2f8b0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70  ADONLY;.      op
2f8c0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
2f8d0 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61  NLY;.      isRea
2f8e0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
2f8f0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2f900 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
2f910 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
2f920 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
2f930 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2f940 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2f950 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2f960 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65  T, "open", zName
2f970 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
2f980 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2f990 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2f9a0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
2f9b0 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e  nning as root an
2f9c0 64 20 69 66 20 63 72 65 61 74 69 6e 67 20 61 20  d if creating a 
2f9d0 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20  new rollback.   
2f9e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57   ** journal or W
2f9f0 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65  AL file, set the
2fa00 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
2fa10 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c  e journal or WAL
2fa20 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68   to be.    ** th
2fa30 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72  e same as the or
2fa40 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
2fa50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fa60 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
2fa70 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
2fa80 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2fa90 4c 29 20 29 7b 0a 20 20 20 20 20 20 6f 73 46 63  L) ){.      osFc
2faa0 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69  hown(fd, uid, gi
2fab0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d);.    }.  }.  
2fac0 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
2fad0 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
2fae0 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
2faf0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
2fb00 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65  .  if( p->pUnuse
2fb10 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75  d ){.    p->pUnu
2fb20 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
2fb30 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c    p->pUnused->fl
2fb40 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
2fb50 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
2fb60 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
2fb70 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
2fb80 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Name;.#else.    
2fb90 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b  osUnlink(zName);
2fba0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
2fbb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2fbc0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
2fbd0 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
2fbe0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2fbf0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2fc00 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
2fc10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2fc20 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66  _DB;..  .#if def
2fc30 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2fc40 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2fc50 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2fc60 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
2fc70 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2fc80 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
2fc90 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45  e*)pFile)->lastE
2fca0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2fcb0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2fcc0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2fcd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2fce0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2fcf0 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
2fd00 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c  strncmp("msdos",
2fd10 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
2fd20 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
2fd30 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
2fd40 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
2fd50 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
2fd60 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
2fd70 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  if..  /* Set up 
2fd80 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c  appropriate ctrl
2fd90 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69  Flags */.  if( i
2fda0 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20  sDelete )       
2fdb0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2fdc0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
2fdd0 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52  ELETE;.  if( isR
2fde0 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20  eadonly )       
2fdf0 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
2fe00 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
2fe10 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  NLY;.  if( noLoc
2fe20 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  k )             
2fe30 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2fe40 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2fe50 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72  K;.  if( syncDir
2fe60 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
2fe70 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2fe80 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2fe90 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
2fea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
2feb0 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ) ctrlFlags |= U
2fec0 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69  NIXFILE_URI;..#i
2fed0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2fee0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
2fef0 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
2ff00 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
2ff10 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
2ff20 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
2ff30 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
2ff40 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
2ff50 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
2ff60 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
2ff70 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
2ff80 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
2ff90 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2ffa0 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
2ffb0 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
2ffc0 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
2ffd0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
2ffe0 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
2fff0 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
30000 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
30010 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
30020 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
30030 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
30040 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
30050 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
30060 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
30070 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
30080 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
30090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
300a0 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
300b0 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
300c0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
300d0 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
300e0 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73  lose(fd) call is
300f0 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66   sub-optimal. If
30100 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
30110 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
30120 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61 73   fd is a databas
30130 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  e file, and ther
30140 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e  e are other conn
30150 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20  ections open.   
30160 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20       ** on that 
30170 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63 75  file that are cu
30180 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
30190 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f  advisory locks o
301a0 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  n it,.        **
301b0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74   then the call t
301c0 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63  o close() will c
301d0 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b  ancel those lock
301e0 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a  s. In practice,.
301f0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65          ** we're
30200 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73   assuming that s
30210 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20  tatfs() doesn't 
30220 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e  fail very often.
30230 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   At least.      
30240 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f    ** not while o
30250 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
30260 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20  ptors opened by 
30270 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
30280 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   on.        ** t
30290 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65  he same file are
302a0 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20   working.  */.  
302b0 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72        p->lastErr
302c0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
302d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
302e0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
302f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
30300 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
30310 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ESS;.        got
30320 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
30330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
30340 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e  seProxy = !(fsIn
30350 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c  fo.f_flags&MNT_L
30360 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  OCAL);.    }.   
30370 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b   if( useProxy ){
30380 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c  .      rc = fill
30390 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
303a0 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74   fd, pFile, zPat
303b0 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  h, ctrlFlags);. 
303c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
303d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
303e0 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
303f0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75  sformUnixFile((u
30400 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20  nixFile*)pFile, 
30410 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20  ":auto:");.     
30420 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30440 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f    /* Use unixClo
30450 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  se to clean up t
30460 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64  he resources add
30470 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78  ed in fillInUnix
30480 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20  File .          
30490 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c  ** and clear all
304a0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73   the structure's
304b0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70   references.  Sp
304c0 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20  ecifically, .   
304d0 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d         ** pFile-
304e0 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62  >pMethods will b
304f0 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65  e NULL so sqlite
30500 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65  3OsClose will be
30510 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20   a no-op .      
30520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30530 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65   unixClose(pFile
30540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
30550 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30570 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
30580 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ed;.    }.  }.#e
30590 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66  ndif.  .  rc = f
305a0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
305b0 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
305c0 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
305d0 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  ;..open_finished
305e0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
305f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
30600 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e  ite3_free(p->pUn
30610 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  used);.  }.  ret
30620 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
30630 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
30640 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
30650 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
30660 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
30670 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
30680 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
30690 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
306a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
306b0 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  xDelete(.  sqlit
306c0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
306d0 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74       /* VFS cont
306e0 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74  aining this as t
306f0 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f  he xDelete metho
30700 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
30710 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
30720 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
30730 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
30740 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20  /.  int dirSync 
30750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30760 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28   If true, fsync(
30770 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  ) directory afte
30780 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20  r deleting file 
30790 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
307a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e   SQLITE_OK;.  UN
307b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
307c0 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
307d0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
307e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
307f0 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73  ELETE);.  if( os
30800 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  Unlink(zPath)==(
30810 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65  -1) ){.    if( e
30820 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno==ENOENT ){.
30830 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30840 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
30850 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OENT;.    }else{
30860 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
30870 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30880 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
30890 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
308a0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
308b0 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   rc;.  }.#ifndef
308c0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
308d0 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
308e0 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
308f0 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
30900 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
30910 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
30920 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
30930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
30940 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
30950 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
30960 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
30970 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
30980 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
30990 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
309a0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
309b0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
309c0 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
309d0 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
309e0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
309f0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
30a00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
30a10 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
30a20 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
30a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30a40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
30a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30a60 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
30a70 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tence of or acce
30a80 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
30a90 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
30aa0 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
30ab0 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
30ac0 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
30ad0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
30ae0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
30af0 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
30b00 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
30b10 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
30b20 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
30b30 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
30b40 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
30b50 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
30b60 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
30b70 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
30b80 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
30b90 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
30ba0 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
30bb0 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
30bc0 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
30bd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
30be0 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20  tUsed,   /* The 
30bf0 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
30c00 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68  his xAccess meth
30c10 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
30c20 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
30c30 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66  /* Path of the f
30c40 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a  ile to examine *
30c50 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
30c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
30c70 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74  hat do we want t
30c80 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68  o learn about th
30c90 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f  e zPath file? */
30ca0 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
30cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
30cc0 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65  ite result boole
30cd0 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  an here */.){.  
30ce0 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20  int amode = 0;. 
30cf0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30d00 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
30d10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
30d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30d30 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
30d40 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
30d50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
30d60 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
30d70 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f        amode = F_
30d80 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
30d90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
30da0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
30db0 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  E:.      amode =
30dc0 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20   W_OK|R_OK;.    
30dd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
30de0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
30df0 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64  READ:.      amod
30e00 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = R_OK;.      
30e10 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
30e20 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
30e30 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
30e40 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
30e50 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28  }.  *pResOut = (
30e60 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20  osAccess(zPath, 
30e70 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66  amode)==0);.  if
30e80 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
30e90 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26  ACCESS_EXISTS &&
30ea0 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20   *pResOut ){.   
30eb0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
30ec0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ;.    if( 0==osS
30ed0 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29  tat(zPath, &buf)
30ee0 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d   && buf.st_size=
30ef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  =0 ){.      *pRe
30f00 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  sOut = 0;.    }.
30f10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
30f20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
30f30 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
30f40 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
30f50 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
30f60 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
30f70 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
30f80 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
30f90 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
30fa0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
30fb0 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
30fc0 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
30fd0 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
30fe0 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
30ff0 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
31000 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
31010 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
31020 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
31030 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
31040 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
31050 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
31060 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
31070 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
31080 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
31090 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
310a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
310b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
310c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
310d0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
310e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
310f0 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
31100 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
31110 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
31120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31130 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
31140 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
31150 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
31160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31170 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
31180 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49  er */.){..  /* I
31190 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
311a0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
311b0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
311c0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
311d0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
311e0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
311f0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
31200 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
31210 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
31220 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
31230 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
31240 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
31250 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
31260 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
31270 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
31280 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
31290 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
312a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
312b0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
312c0 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
312d0 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
312e0 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
312f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
31300 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
31310 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
31320 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
31330 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
31340 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
31350 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
31360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
31370 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
31380 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  osGetcwd(zOut, n
31390 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-1)==0 ){.   
313a0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
313b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
313c0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65  NTOPEN_BKPT, "ge
313d0 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20  tcwd", zPath);. 
313e0 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
313f0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
31400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
31410 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77  nprintf(nOut-nCw
31420 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20  d, &zOut[nCwd], 
31430 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20  "/%s", zPath);. 
31440 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
31450 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TE_OK;.}...#ifnd
31460 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
31470 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
31480 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
31490 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
314a0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
314b0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
314c0 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
314d0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
314e0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
314f0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
31500 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
31510 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
31520 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
31530 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
31540 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
31550 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
31560 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
31570 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
31580 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
31590 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
315a0 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
315b0 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
315c0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
315d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
315e0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
315f0 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
31600 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
31610 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
31620 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
31630 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
31640 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
31650 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
31660 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
31670 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
31680 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
31690 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
316a0 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
316b0 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
316c0 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
316d0 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
316e0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
316f0 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
31700 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31710 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
31720 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
31730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
31740 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
31750 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
31760 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
31770 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
31780 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
31790 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
317a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
317b0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
317c0 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
317d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
317e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
317f0 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
31800 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
31810 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
31820 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
31830 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
31840 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
31850 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
31860 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
31870 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
31880 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
31890 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
318a0 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
318b0 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
318c0 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
318d0 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
318e0 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
318f0 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
31900 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
31910 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
31920 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
31930 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
31940 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
31950 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
31960 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
31970 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31980 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
31990 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
319a0 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
319b0 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
319c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
319d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
319e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
319f0 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
31a00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31a10 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
31a20 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
31a30 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
31a40 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
31a50 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
31a60 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
31a70 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
31a80 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
31a90 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
31aa0 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
31ab0 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
31ac0 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
31ad0 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
31ae0 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
31af0 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
31b00 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
31b10 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
31b20 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
31b30 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
31b40 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
31b50 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
31b60 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
31b70 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
31b80 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
31b90 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
31ba0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
31bb0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31bc0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
31bd0 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
31be0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
31bf0 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
31c00 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
31c10 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
31c20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
31c30 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31c40 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
31c50 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
31c60 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31c70 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
31c80 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
31c90 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
31ca0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
31cb0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
31cc0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
31cd0 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
31ce0 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
31cf0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
31d00 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
31d10 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
31d20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
31d30 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
31d40 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
31d50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
31d60 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
31d70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
31d80 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
31d90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
31da0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
31db0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
31dc0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31dd0 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
31de0 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
31df0 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
31e00 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
31e10 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
31e20 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
31e30 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
31e40 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
31e50 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
31e60 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
31e70 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
31e80 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
31e90 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
31ea0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
31eb0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
31ec0 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
31ed0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
31ee0 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
31ef0 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
31f00 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
31f10 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
31f20 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
31f30 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
31f40 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
31f50 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
31f60 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
31f70 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
31f80 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
31f90 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
31fa0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
31fb0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
31fc0 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
31fd0 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
31fe0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
31ff0 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
32000 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
32010 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
32020 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
32030 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
32040 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
32050 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
32060 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
32070 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
32080 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
32090 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73  f);.  randomness
320a0 50 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 20  Pid = getpid(); 
320b0 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
320c0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
320d0 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
320e0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
320f0 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
32100 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
32110 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
32120 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
32130 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
32140 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
32150 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
32160 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
32170 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
32180 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
32190 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
321a0 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
321b0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
321c0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
321d0 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
321e0 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
321f0 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
32200 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
32210 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
32220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
32230 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
32240 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
32250 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
32260 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
32270 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
32280 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
32290 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
322a0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
322b0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
322c0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
322d0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
322e0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
322f0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
32300 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
32310 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
32320 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
32330 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
32340 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
32350 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
32360 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
32370 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
32380 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
32390 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
323a0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
323b0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
323c0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
323d0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
323e0 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
323f0 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
32400 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
32410 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
32420 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
32430 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32440 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
32450 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
32460 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
32470 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
32480 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
32490 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
324a0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
324b0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
324c0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
324d0 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
324e0 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
324f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32500 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
32510 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
32520 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
32530 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
32540 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
32550 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
32560 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32570 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32580 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
32590 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
325a0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
325b0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
325c0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
325d0 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
325e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
325f0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
32600 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
32610 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
32620 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
32630 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
32640 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
32650 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
32660 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
32670 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
32680 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
32690 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
326a0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
326b0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
326c0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
326d0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
326e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
326f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
32700 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
32710 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
32720 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
32730 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
32740 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
32750 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
32760 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
32770 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
32780 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
32790 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
327a0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
327b0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
327c0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
327d0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
327e0 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
327f0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
32800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
32810 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
32820 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
32830 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
32840 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
32850 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
32860 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
32870 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
32880 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
32890 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
328a0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
328b0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
328c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
328d0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
328e0 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
328f0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
32900 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
32910 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
32920 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32930 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
32940 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
32950 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
32960 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
32970 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
32980 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
32990 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
329a0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
329b0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
329c0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
329d0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
329e0 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
329f0 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
32a00 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
32a10 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
32a20 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
32a30 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
32a40 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
32a50 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
32a60 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
32a70 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
32a80 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
32a90 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
32aa0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
32ab0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
32ac0 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69  Now;.  if( getti
32ad0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
32ae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e  )==0 ){.    *piN
32af0 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
32b00 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
32b10 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
32b20 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
32b30 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1000;.  }else{. 
32b40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
32b50 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RROR;.  }.#endif
32b60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
32b70 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
32b80 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
32b90 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
32ba0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
32bb0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
32bc0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
32bd0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
32be0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32bf0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32c00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
32c10 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
32c20 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
32c30 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
32c40 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
32c50 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
32c60 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
32c70 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
32c80 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
32c90 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
32ca0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
32cb0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
32cc0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
32cd0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
32ce0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
32cf0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32d00 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
32d10 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
32d20 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20  _int64 i = 0;.  
32d30 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44  int rc;.  UNUSED
32d40 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32d50 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78  ed);.  rc = unix
32d60 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
32d70 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
32d80 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
32d90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
32da0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
32db0 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
32dc0 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
32dd0 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
32de0 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
32df0 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
32e00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
32e10 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
32e20 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
32e30 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
32e40 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
32e50 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
32e60 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
32e70 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
32e80 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
32e90 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
32ea0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
32eb0 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
32ec0 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
32ed0 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
32ee0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
32ef0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
32f00 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32f10 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
32f20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
32f30 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32f40 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32f50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32f60 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
32f70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32f80 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
32f90 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
32fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32fb0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
32fc0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
32fd0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
32fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
32ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
33040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330a0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
330b0 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
330c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
330e0 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
330f0 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
33100 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
33110 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
33120 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
33130 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
33140 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
33150 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
33160 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
33170 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
33180 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
33190 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
331a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
331b0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
331c0 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
331d0 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
331e0 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
331f0 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
33200 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
33210 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
33220 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
33230 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
33240 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
33250 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
33260 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
33270 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
33280 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
33290 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
332a0 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
332b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
332c0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
332d0 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
332e0 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
332f0 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
33300 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
33310 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
33320 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
33330 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
33340 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
33350 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
33360 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
33370 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
33380 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
33390 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
333a0 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
333b0 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
333c0 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
333d0 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
333e0 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
333f0 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
33400 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
33410 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
33420 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
33430 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
33440 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
33450 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
33460 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
33470 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
33480 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
33490 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
334a0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
334b0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
334c0 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
334d0 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
334e0 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
334f0 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
33500 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
33510 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
33520 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
33530 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
33540 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
33550 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
33560 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
33570 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
33580 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
33590 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
335a0 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
335b0 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
335c0 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20  40000000.**     
335d0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
335e0 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
335f0 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
33600 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
33610 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
33620 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
33630 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
33640 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
33650 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
33660 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
33670 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
33680 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
33690 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
336a0 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
336b0 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
336c0 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
336d0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
336e0 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
336f0 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
33700 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
33710 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
33720 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
33730 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
33740 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
33750 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
33760 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
33770 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
33780 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
33790 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
337a0 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
337b0 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
337c0 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
337d0 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
337e0 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
337f0 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
33800 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
33810 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
33820 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
33830 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
33840 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
33850 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
33860 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
33870 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
33880 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
33890 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
338a0 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
338b0 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
338c0 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
338d0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
338e0 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
338f0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
33900 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
33910 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
33920 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
33930 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
33940 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
33950 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
33960 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
33970 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
33980 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
33990 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
339a0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
339b0 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
339c0 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
339d0 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
339e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
339f0 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
33a00 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
33a10 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
33a20 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
33a30 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
33a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a50 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
33a60 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
33a70 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
33a80 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
33a90 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
33aa0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
33ab0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
33ac0 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
33ad0 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
33ae0 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
33af0 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
33b00 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
33b10 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
33b20 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
33b30 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
33b40 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
33b50 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
33b60 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
33b70 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
33b80 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
33b90 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
33ba0 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
33bb0 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
33bc0 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
33bd0 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
33be0 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
33bf0 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
33c00 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
33c10 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
33c20 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
33c30 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
33c40 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
33c50 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
33c60 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
33c70 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
33c80 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
33c90 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
33ca0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
33cb0 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
33cc0 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
33cd0 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
33ce0 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
33cf0 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
33d00 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
33d10 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
33d20 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
33d30 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
33d40 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
33d50 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
33d60 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
33d70 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
33d80 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
33d90 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
33da0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
33db0 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
33dc0 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
33dd0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
33de0 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
33df0 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
33e00 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
33e10 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
33e20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
33e30 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
33e40 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
33e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
33e60 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
33e70 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
33e80 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
33e90 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
33ea0 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
33eb0 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
33ec0 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
33ed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33ee0 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
33ef0 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
33f00 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
33f10 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
33f20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
33f30 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
33f40 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
33f50 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
33f60 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
33f70 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
33f80 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
33f90 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
33fa0 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
33fb0 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
33fc0 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
33fd0 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
33fe0 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
33ff0 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
34000 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
34010 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
34020 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
34030 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
34040 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
34050 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
34060 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
34070 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
34080 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
34090 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
340a0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
340b0 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
340c0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
340d0 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
340e0 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
340f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34100 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
34110 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
34120 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
34130 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
34140 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
34150 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
34160 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
34170 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
34180 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
34190 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
341a0 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
341b0 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
341c0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
341d0 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
341e0 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
341f0 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
34200 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
34210 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
34220 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
34230 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
34240 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
34250 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
34260 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
34270 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
34280 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
34290 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
342a0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
342b0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
342c0 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
342d0 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
342e0 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
342f0 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
34300 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
34310 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
34320 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
34330 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
34340 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
34350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34360 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
34370 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
34380 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
34390 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
343a0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
343b0 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
343c0 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
343d0 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
343e0 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
343f0 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
34400 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
34410 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
34420 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
34430 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
34440 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
34450 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
34460 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
34470 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
34480 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
34490 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
344a0 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
344b0 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
344c0 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
344d0 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
344e0 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
344f0 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
34500 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
34510 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
34520 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
34530 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
34540 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
34550 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
34560 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
34570 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
34580 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
34590 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
345a0 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
345b0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
345c0 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
345d0 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
345e0 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
345f0 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
34600 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
34610 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
34620 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
34630 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
34640 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
34650 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
34660 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
34670 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
34680 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
34690 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
346a0 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
346b0 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
346c0 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
346d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
346e0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
346f0 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
34700 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
34710 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
34720 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
34730 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
34740 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
34750 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
34760 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
34770 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
34780 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
34790 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
347a0 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
347b0 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
347c0 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
347d0 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
347e0 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
347f0 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
34800 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
34810 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
34820 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
34830 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
34840 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
34850 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
34860 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
34870 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
34880 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
34890 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
348a0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
348b0 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
348c0 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
348d0 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
348e0 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
348f0 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
34900 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
34910 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
34920 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
34930 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
34940 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
34950 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
34960 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
34970 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
34980 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
34990 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
349a0 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
349b0 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
349c0 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
349d0 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
349e0 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
349f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
34a00 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
34a10 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
34a20 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
34a30 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
34a40 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
34a50 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
34a60 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
34a70 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
34a80 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
34a90 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
34aa0 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
34ab0 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
34ac0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
34ad0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
34ae0 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
34af0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
34b00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
34b10 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
34b20 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
34b30 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
34b40 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
34b50 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
34b60 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
34b70 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
34b80 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
34b90 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
34ba0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34bb0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34bc0 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
34bd0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34be0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
34bf0 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
34c00 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
34c10 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
34c20 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
34c30 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
34c40 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
34c50 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
34c60 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
34c70 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
34c80 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
34c90 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
34ca0 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
34cb0 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
34cc0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
34cd0 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34cf0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
34d00 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
34d10 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
34d20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
34d30 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
34d40 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
34d50 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
34d60 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
34d70 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
34d80 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
34d90 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
34da0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
34db0 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
34dc0 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
34dd0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
34de0 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
34df0 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
34e00 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
34e10 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
34e20 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
34e30 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
34e40 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
34e50 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
34e60 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
34e70 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
34e80 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
34e90 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
34ea0 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
34eb0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
34ec0 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
34ed0 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
34ee0 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
34ef0 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
34f00 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
34f10 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
34f20 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
34f30 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
34f40 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
34f50 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
34f60 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
34f70 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
34f80 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
34f90 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
34fa0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
34fb0 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
34fc0 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
34fd0 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
34fe0 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
34ff0 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
35000 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
35010 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
35020 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
35030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35040 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
35050 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
35060 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
35070 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
35080 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
35090 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
350a0 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
350b0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
350c0 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
350d0 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
350e0 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
350f0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
35100 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
35110 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
35120 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
35130 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
35140 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
35150 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
35160 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
35170 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
35180 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
35190 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
351a0 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
351b0 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
351c0 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
351d0 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
351e0 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
351f0 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
35200 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
35210 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
35220 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
35230 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
35240 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
35250 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
35260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35270 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
35280 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
35290 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
352a0 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
352b0 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
352c0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
352d0 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
352e0 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
352f0 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
35300 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
35310 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
35320 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
35330 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
35340 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
35350 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
35360 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
35370 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
35380 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
35390 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
353a0 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
353b0 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
353c0 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
353d0 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
353e0 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
353f0 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
35400 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
35410 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
35420 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
35430 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
35440 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
35450 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
35460 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
35470 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
35480 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
35490 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
354a0 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
354b0 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
354c0 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
354d0 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
354e0 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
354f0 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c  if( osMkdir(buf,
35500 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
35510 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
35520 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
35530 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
35540 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35550 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
35560 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
35570 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
35580 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
35590 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
355a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355b0 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
355c0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
355d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
355e0 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
355f0 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
35600 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
35610 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
35620 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
35630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35640 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35650 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
35660 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
35670 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
35680 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
35690 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
356a0 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
356b0 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
356c0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
356d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
356e0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
356f0 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69   VFS file descri
35700 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20  ptor (stored in 
35710 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
35720 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
35730 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e  malloc) and open
35740 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20   the file named 
35750 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69  "path" in the fi
35760 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
35770 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
35780 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e  is responsible n
35790 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73  ot only for clos
357a0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73  ing the file des
357b0 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61  criptor.** but a
357c0 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20  lso for freeing 
357d0 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  the memory assoc
357e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
357f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
35800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
35810 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
35820 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e(.    const cha
35830 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
35840 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  /* path for the 
35850 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a  new unixFile */.
35860 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70      unixFile **p
35870 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  pFile,       /* 
35880 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64  unixFile created
35890 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79   and returned by
358a0 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20   ref */.    int 
358b0 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20  islockfile      
358c0 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a       /* if non z
358d0 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73  ero missing dirs
358e0 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
358f0 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64   */.) {.  int fd
35900 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
35910 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
35920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35930 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
35940 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
35950 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
35960 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
35970 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
35980 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
35990 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
359a0 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
359b0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
359c0 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
359d0 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
359e0 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
359f0 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
35a00 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
35a10 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
35a20 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
35a30 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
35a40 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
35a50 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
35a60 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
35a70 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
35a80 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
35a90 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
35aa0 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
35ab0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
35ac0 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
35ad0 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
35ae0 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
35af0 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
35b00 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
35b10 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
35b20 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
35b30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
35b40 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
35b50 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
35b60 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
35b70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
35b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35b90 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
35ba0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
35bb0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
35bc0 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
35bd0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66  errno;.    if( f
35be0 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  d<0 && errno==EN
35bf0 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69  OENT && islockfi
35c00 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
35c10 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
35c20 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c  ath(path) == SQL
35c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35c40 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
35c50 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
35c60 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  gs, 0);.      }.
35c70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
35c80 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  fd<0 ){.    open
35c90 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
35ca0 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
35cb0 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
35cc0 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
35cd0 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
35ce0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
35cf0 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b  {.    if( islock
35d00 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65  file ){.      re
35d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
35d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
35d30 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20  ch (terrno) {.  
35d40 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a      case EACCES:
35d50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
35d60 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
35d70 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20     case EIO: .  
35d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35d90 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20  ITE_IOERR_LOCK; 
35da0 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  /* even though i
35db0 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a  t is the conch *
35dc0 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  /.      default:
35dd0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
35de0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
35df0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
35e00 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69    .  pNew = (uni
35e10 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
35e20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
35e30 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  New));.  if( pNe
35e40 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  w==NULL ){.    r
35e50 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
35e60 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63  ;.    goto end_c
35e70 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d  reate_proxy;.  }
35e80 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
35e90 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
35ea0 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  le));.  pNew->op
35eb0 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
35ec0 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ags;.  memset(&d
35ed0 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65  ummyVfs, 0, size
35ee0 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20  of(dummyVfs));. 
35ef0 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61   dummyVfs.pAppDa
35f00 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74  ta = (void*)&aut
35f10 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20  olockIoFinder;. 
35f20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20   dummyVfs.zName 
35f30 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e  = "dummy";.  pUn
35f40 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
35f50 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20   pUnused->flags 
35f60 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70  = openFlags;.  p
35f70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  New->pUnused = p
35f80 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20  Unused;.  .  rc 
35f90 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
35fa0 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20  (&dummyVfs, fd, 
35fb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
35fc0 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20  New, path, 0);. 
35fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35fe0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c  OK ){.    *ppFil
35ff0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65  e = pNew;.    re
36000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36010 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70    }.end_create_p
36020 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75  roxy:    .  robu
36030 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66  st_close(pNew, f
36040 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
36050 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
36060 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
36070 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
36080 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
36090 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
360a0 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
360b0 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
360c0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
360d0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
360e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
360f0 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
36100 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
36110 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
36120 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
36130 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
36140 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c  th */../* Not al
36150 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ways defined in 
36160 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69  the headers as i
36170 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f  t ought to be */
36180 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68  .extern int geth
36190 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69  ostuuid(uuid_t i
361a0 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  d, const struct 
361b0 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b  timespec *wait);
361c0 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
361d0 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74  t ID via gethost
361e0 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20  uuid(), pHostID 
361f0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52  must point to PR
36200 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a  OXY_HOSTIDLEN .*
36210 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61  * bytes of writa
36220 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ble memory..*/.s
36230 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
36240 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65  etHostID(unsigne
36250 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  d char *pHostID,
36260 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
36270 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f   assert(PROXY_HO
36280 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f  STIDLEN == sizeo
36290 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65  f(uuid_t));.  me
362a0 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c  mset(pHostID, 0,
362b0 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
362c0 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  );.#if defined(_
362d0 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAX_OS_X_VERSIO
362e0 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c  N_MIN_REQUIRED)\
362f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36300 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45  && __MAC_OS_X_VE
36310 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52  RSION_MIN_REQUIR
36320 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20  ED<1050.  {.    
36330 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
36340 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
36350 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
36360 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
36370 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f  */.    if( getho
36380 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20  stuuid(pHostID, 
36390 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20  &timeout) ){.   
363a0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
363b0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  no;.      if( pE
363c0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
363d0 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20  *pError = err;. 
363e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
363f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
36400 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
36410 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
36420 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65  ETER(pError);.#e
36430 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
36440 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
36450 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
36460 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
36470 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
36480 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
36490 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
364a0 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
364b0 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
364c0 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
364d0 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
364e0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
364f0 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
36500 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
36510 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
36520 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
36530 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
36540 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
36550 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
36560 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
36570 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
36580 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
36590 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
365a0 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
365b0 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
365c0 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
365d0 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
365e0 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
365f0 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
36600 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
36610 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
36620 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
36630 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
36640 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
36650 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
36660 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
36670 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
36680 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
36690 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
366a0 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
366b0 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
366c0 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
366d0 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
366e0 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
366f0 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
36700 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
36710 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
36720 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
36730 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
36740 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
36750 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
36760 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
36770 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
36780 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36790 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
367a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
367b0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
367c0 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
367d0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
367e0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
367f0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
36800 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
36810 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
36820 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
36830 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
36840 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
36850 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
36860 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
36870 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
36880 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
36890 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
368a0 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
368b0 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
368c0 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
368d0 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
368e0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
368f0 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45  rc = -1;.  UNUSE
36900 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f  D_PARAMETER(myHo
36910 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65  stID);..  /* cre
36920 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
36930 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
36940 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
36950 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
36960 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
36970 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
36980 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
36990 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
369a0 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
369b0 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
369c0 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
369d0 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
369e0 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
369f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
36a00 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
36a10 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68  sg),errmsg,"path
36a20 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
36a30 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a  ,(int)pathLen);.
36a40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
36a50 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
36a60 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
36a70 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
36a80 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63  dLen = osPread(c
36a90 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
36aa0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
36ab0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
36ac0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
36ad0 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71  HINDEX ){.    sq
36ae0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
36af0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
36b00 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72  rmsg,"read error
36b10 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
36b20 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
36b30 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
36b40 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
36b50 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
36b60 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
36b70 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f  ile */.  fd = ro
36b80 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c  bust_open(tPath,
36b90 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
36ba0 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20  |O_EXCL), 0);.  
36bb0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
36bc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
36bd0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
36be0 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
36bf0 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
36c00 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
36c10 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
36c20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
36c30 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
36c40 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
36c50 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
36c60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
36c70 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
36c80 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
36c90 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
36ca0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
36cb0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
36cc0 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
36cd0 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
36ce0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
36cf0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
36d00 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
36d10 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
36d20 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
36d30 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
36d40 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
36d50 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
36d60 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
36d70 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
36d80 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
36d90 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
36da0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
36db0 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
36dc0 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
36dd0 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
36de0 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
36df0 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
36e00 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
36e10 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
36e20 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
36e30 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20  ink(tPath);.    
36e40 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
36e50 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  File, fd, __LINE
36e60 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  __);.    }.    f
36e70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36e80 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20  failed to break 
36e90 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
36ea0 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20  , %s\n", cPath, 
36eb0 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72  errmsg);.  }.  r
36ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
36ed0 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74  Take the request
36ee0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
36ef0 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72  onch file and br
36f00 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b  eak a stale lock
36f10 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
36f20 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a   id matches..*/.
36f30 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
36f40 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
36f50 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
36f60 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20  t myHostID, int 
36f70 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f  lockType){.  pro
36f80 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36f90 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
36fa0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
36fb0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
36fc0 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
36fd0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
36fe0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
36ff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37000 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72  TE_OK;.  int nTr
37010 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ies = 0;.  struc
37020 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68  t timespec conch
37030 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65  ModTime;.  .  me
37040 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69  mset(&conchModTi
37050 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f  me, 0, sizeof(co
37060 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20  nchModTime));.  
37070 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  do {.    rc = co
37080 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
37090 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
370a0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
370b0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
370c0 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20   nTries ++;.    
370d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
370e0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  USY ){.      /* 
370f0 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  If the lock fail
37100 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20  ed (busy):.     
37110 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74    * 1st try: get
37120 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66   the mod time of
37130 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74   the conch, wait
37140 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67   0.5s and try ag
37150 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32  ain. .       * 2
37160 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20  nd try: fail if 
37170 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61  the mod time cha
37180 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20  nged or host id 
37190 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61  is different, wa
371a0 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20  it .       *    
371b0 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e         10 sec an
371c0 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  d try again.    
371d0 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72     * 3rd try: br
371e0 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c  eak the lock unl
371f0 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  ess the mod time
37200 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20   has changed..  
37210 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
37220 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
37230 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
37240 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26  (conchFile->h, &
37250 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  buf) ){.        
37260 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
37270 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
37280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37290 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
372a0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
372b0 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29   if( nTries==1 )
372c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  {.        conchM
372d0 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f  odTime = buf.st_
372e0 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20  mtimespec;.     
372f0 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30     usleep(500000
37300 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73  ); /* wait 0.5 s
37310 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
37320 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20  ock again*/.    
37330 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
37340 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
37350 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20  ssert( nTries>1 
37360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e  );.      if( con
37370 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63  chModTime.tv_sec
37380 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
37390 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a  spec.tv_sec || .
373a0 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f           conchMo
373b0 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d  dTime.tv_nsec !=
373c0 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
373d0 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20  c.tv_nsec ){.   
373e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
373f0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d  TE_BUSY;.      }
37400 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
37410 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20  ( nTries==2 ){  
37420 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42  .        char tB
37430 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
37440 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
37450 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64  nt len = osPread
37460 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74  (conchFile->h, t
37470 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
37480 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
37490 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
374a0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
374b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
374c0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
374d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
374e0 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
374f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
37500 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en>PROXY_PATHIND
37510 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28  EX && tBuf[0]==(
37520 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
37530 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20  VERSION){.      
37540 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
37550 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74  ak the lock if t
37560 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e  he host id doesn
37570 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  't match */.    
37580 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d        if( 0!=mem
37590 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f  cmp(&tBuf[PROXY_
375a0 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
375b0 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
375c0 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
375d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
375e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
375f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
37600 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
37610 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
37620 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20  e lock on short 
37630 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f  read or a versio
37640 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  n mismatch */.  
37650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37660 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
37670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73      }.        us
37680 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20  leep(10000000); 
37690 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61  /* wait 10 sec a
376a0 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
376b0 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
376c0 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20   continue; .    
376d0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
376e0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d   assert( nTries=
376f0 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
37700 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  0==proxyBreakCon
37710 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
37720 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20  HostID) ){.     
37730 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
37740 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  K;.        if( l
37750 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49  ockType==EXCLUSI
37760 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
37770 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
37780 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
37790 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
377a0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
377b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20  ARED_LOCK);     
377c0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
377d0 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20          if( !rc 
377e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
377f0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
37800 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
37810 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
37820 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
37830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37840 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69   }.    }.  } whi
37850 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
37860 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20  USY && nTries<3 
37870 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  );.  .  return r
37880 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74  c;.}../* Takes t
37890 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69  he conch by taki
378a0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
378b0 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f   and read the co
378c0 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66  ntents conch, if
378d0 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73   .** lockPath is
378e0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68   non-NULL, the h
378f0 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20  ost ID and lock 
37900 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d  file path must m
37910 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a  atch.  A NULL .*
37920 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73  * lockPath means
37930 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61   that the lockPa
37940 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
37950 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
37960 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  d if the .** hos
37970 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20  t IDs match, or 
37980 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20  a new lock path 
37990 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
379a0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
379b0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20  .** and written 
379c0 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  to the conch fil
379d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
379e0 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
379f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
37a00 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
37a10 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
37a20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
37a30 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
37a40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
37a50 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f   .  if( pCtx->co
37a60 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20  nchHeld!=0 ){.  
37a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37a80 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
37a90 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
37aa0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
37ab0 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64  chFile;.    uuid
37ac0 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20  _t myHostID;.   
37ad0 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b   int pError = 0;
37ae0 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75  .    char readBu
37af0 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
37b00 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c  LEN];.    char l
37b10 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  ockPath[MAXPATHL
37b20 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  EN];.    char *t
37b30 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55  empLockPath = NU
37b40 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  LL;.    int rc =
37b50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
37b60 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20  int createConch 
37b70 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73  = 0;.    int hos
37b80 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  tIdMatch = 0;.  
37b90 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20    int readLen = 
37ba0 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c  0;.    int tryOl
37bb0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
37bc0 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c     int forceNewL
37bd0 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
37be0 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22   .    OSTRACE(("
37bf0 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  TAKECONCH  %d fo
37c00 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
37c10 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
37c20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
37c30 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
37c40 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
37c50 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
37c60 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a  ), getpid()));..
37c70 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65      rc = proxyGe
37c80 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44  tHostID(myHostID
37c90 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  , &pError);.    
37ca0 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  if( (rc&0xff)==S
37cb0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
37cc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
37cd0 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a  Errno = pError;.
37ce0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
37cf0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
37d00 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
37d10 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
37d20 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f  yHostID, SHARED_
37d30 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
37d40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37d50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
37d60 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
37d70 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20      /* read the 
37d80 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66  existing conch f
37d90 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c  ile */.    readL
37da0 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  en = seekAndRead
37db0 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63  ((unixFile*)conc
37dc0 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75  hFile, 0, readBu
37dd0 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
37de0 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  HLEN);.    if( r
37df0 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  eadLen<0 ){.    
37e00 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20    /* I/O error: 
37e10 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
37e20 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
37e30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
37e40 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69  tErrno = conchFi
37e50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
37e60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37e70 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 20  _IOERR_READ;.   
37e80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
37e90 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65  conch;.    }else
37ea0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50   if( readLen<=(P
37eb0 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
37ec0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
37ed0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
37ee0 20 72 65 61 64 42 75 66 5b 30 5d 21 3d 28 63 68   readBuf[0]!=(ch
37ef0 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
37f00 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f  RSION ){.      /
37f10 2a 20 61 20 73 68 6f 72 74 20 72 65 61 64 20 6f  * a short read o
37f20 72 20 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74  r version format
37f30 20 6d 69 73 6d 61 74 63 68 20 6d 65 61 6e 73 20   mismatch means 
37f40 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
37f50 65 20 61 20 6e 65 77 20 0a 20 20 20 20 20 20 2a  e a new .      *
37f60 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20  * conch file. . 
37f70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 72       */.      cr
37f80 65 61 74 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20  eateConch = 1;. 
37f90 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74     }.    /* if t
37fa0 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68  he host id match
37fb0 65 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  es and the lock 
37fc0 70 61 74 68 20 61 6c 72 65 61 64 79 20 65 78 69  path already exi
37fd0 73 74 73 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  sts in the conch
37fe0 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72  .    ** we'll tr
37ff0 79 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 74  y to use the pat
38000 68 20 74 68 65 72 65 2c 20 69 66 20 77 65 20 63  h there, if we c
38010 61 6e 27 74 20 6f 70 65 6e 20 74 68 61 74 20 70  an't open that p
38020 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20  ath, we'll .    
38030 2a 2a 20 72 65 74 72 79 20 77 69 74 68 20 61 20  ** retry with a 
38040 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65 72 61 74  new auto-generat
38050 65 64 20 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a  ed path .    */.
38060 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63      do { /* in c
38070 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 74  ase we need to t
38080 72 79 20 61 67 61 69 6e 20 66 6f 72 20 61 6e 20  ry again for an 
38090 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63  :auto: named loc
380a0 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  k file */..     
380b0 20 69 66 28 20 21 63 72 65 61 74 65 43 6f 6e 63   if( !createConc
380c0 68 20 26 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f  h && !forceNewLo
380d0 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
380e0 20 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20    hostIdMatch = 
380f0 21 6d 65 6d 63 6d 70 28 26 72 65 61 64 42 75 66  !memcmp(&readBuf
38100 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
38110 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20  ], myHostID, .  
38120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38140 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
38150 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ;.        /* if 
38160 74 68 65 20 63 6f 6e 63 68 20 68 61 73 20 64 61  the conch has da
38170 74 61 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  ta compare the c
38180 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ontents */.     
38190 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
381a0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
381b0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 20           /* for 
381c0 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c  auto-named local
381d0 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74   lock file, just
381e0 20 63 68 65 63 6b 20 74 68 65 20 68 6f 73 74 20   check the host 
381f0 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20  ID and we'll.   
38200 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 74          ** use t
38210 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
38220 6c 65 20 70 61 74 68 20 74 68 61 74 27 73 20 61  le path that's a
38230 6c 72 65 61 64 79 20 69 6e 20 74 68 65 72 65 0a  lready in there.
38240 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
38250 20 20 20 20 20 20 20 20 69 66 28 20 68 6f 73 74          if( host
38260 49 64 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  IdMatch ){.     
38270 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 70 61         size_t pa
38280 74 68 4c 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e  thLen = (readLen
38290 20 2d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   - PROXY_PATHIND
382a0 45 58 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EX);.           
382b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
382c0 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41  ( pathLen>=MAXPA
382d0 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  THLEN ){.       
382e0 20 20 20 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d         pathLen=M
382f0 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20  AXPATHLEN-1;.   
38300 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
38310 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f         memcpy(lo
38320 63 6b 50 61 74 68 2c 20 26 72 65 61 64 42 75 66  ckPath, &readBuf
38330 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
38340 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  ], pathLen);.   
38350 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 50 61 74           lockPat
38360 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a  h[pathLen] = 0;.
38370 20 20 20 20 20 20 20 20 20 20 20 20 74 65 6d 70              temp
38380 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
38390 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ath;.           
383a0 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
383b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
383c0 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
383d0 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
383e0 74 68 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  th if the conch 
383f0 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20  is taken */.    
38400 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
38410 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
38420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
38430 7d 65 6c 73 65 20 69 66 28 20 68 6f 73 74 49 64  }else if( hostId
38440 4d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  Match.          
38450 20 20 20 20 20 26 26 20 21 73 74 72 6e 63 6d 70       && !strncmp
38460 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
38470 50 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50  Path, &readBuf[P
38480 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
38490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
384a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
384b0 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len-PROXY_PATHIN
384c0 44 45 58 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  DEX).        ){.
384d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e            /* con
384e0 63 68 20 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b  ch host and lock
384f0 20 70 61 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20   path match */. 
38500 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
38510 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20  d_takeconch; .  
38520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
38530 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
38540 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e  if the conch isn
38550 27 74 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  't writable and 
38560 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 2c 20 77  doesn't match, w
38570 65 20 63 61 6e 27 74 20 74 61 6b 65 20 69 74 20  e can't take it 
38580 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f  */.      if( (co
38590 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
385a0 67 73 26 4f 5f 52 44 57 5