/ Hex Artifact Content
Login

Artifact 60a7b3b23e6fcf83a50d1e320b280b551724e11f:


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 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e  no.h>.#if !defin
1140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
1150: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
1160: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 69  X_MMAP_SIZE>0.#i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1180: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  .h>.#endif...#if
1190: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11a0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
11b0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11c0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11d0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11e0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11f0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
1200: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
1210: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1220: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1230: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1240: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1250: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1260: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1270: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1280: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1290: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12a0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
12b0: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12c0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12d0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12e0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12f0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
1300: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
1310: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1320: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1330: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1340: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1350: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1360: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1370: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1380: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1390: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
13a0: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
13b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13c0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13d0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13e0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13f0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
1400: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1410: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1420: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1430: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1440: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1450: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1460: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1470: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1480: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1490: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
14a0: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
14b0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d  .** Default perm
14c0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14d0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14e0: 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   dir.*/.#ifndef 
14f0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1500: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1510: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1520: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
1530: 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
1540: 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0755.#endif../*
1550: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
1560: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
1570: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
1580: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
1590: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
15a0: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
15b0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
15c0: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
15d0: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
15e0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
15f0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
1600: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
1610: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
1620: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
1630: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1640: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1650: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1660: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1670: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1690: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
16a0: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
16b0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
16c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
16d0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
16e0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
16f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1700: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
1710: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1720: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
1730: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1740: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1750: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1760: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1770: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1780: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1790: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
17a0: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
17b0: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
17c0: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
17d0: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
17e0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
17f0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
1800: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
1810: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
1820: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
1830: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1840: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1850: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1860: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1870: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1880: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1890: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
18a0: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
18b0: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
18c0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
18f0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
1900: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
1910: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1920: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
1930: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1940: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1950: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1960: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1970: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1980: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1990: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
19a0: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
19b0: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
19c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
19d0: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
19e0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
19f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
1a00: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1a10: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
1a20: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
1a30: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1a40: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1a50: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1a60: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1a70: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1a80: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa0: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1ab0: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1ac0: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1ad0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b00: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b10: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1b40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b60: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b80: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b90: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1ba0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1bb0: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1bc0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bd0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1be0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bf0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c20: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c30: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c40: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c50: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c60: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c70: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c80: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c90: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1cb0: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1cc0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d00: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1d10: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d40: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d50: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d60: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d80: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d90: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1da0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1db0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1dc0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1e00: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1e10: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1e20: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1e30: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1e40: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1e50: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1e60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1e70: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1e80: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1e90: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1ea0: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1eb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1ec0: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1ed0: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ee0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1ef0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1f00: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1f30: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1f40: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1f50: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1f60: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1f80: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1f90: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1fa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1fc0: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1fd0: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1fe0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1ff0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2000: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
2010: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
2040: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
2050: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
2060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2070: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
2080: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2090: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
20a0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
20b0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
20c0: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
20d0: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
20e0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
20f0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
2100: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
2110: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
2120: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
2130: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2140: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2150: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2160: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2170: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2180: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2190: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
21a0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
21b0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
21c0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
21d0: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
21e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
21f0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
2200: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2210: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2220: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
2230: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2240: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2250: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2260: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2270: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2280: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2290: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
22a0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
22b0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
22c0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
22d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
22e0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
22f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2310: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2320: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2330: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2340: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2350: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2360: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2370: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2380: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2390: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
23a0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
23b0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
23c0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
23d0: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
23e0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
23f0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
2400: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2410: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2420: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
2430: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2440: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2450: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2460: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2470: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2480: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2490: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
24a0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
24b0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
24c0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
24d0: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
24e0: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
24f0: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2500: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2510: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2520: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2530: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2540: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2550: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2560: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
2570: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
2580: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
2590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25a0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
25b0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
25c0: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
25d0: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
25e0: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
25f0: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2600: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2610: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2620: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2630: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2640: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2650: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
2660: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
2670: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
2680: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
2690: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
26a0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
26b0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
26c0: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
26d0: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
26e0: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
26f0: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2700: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2710: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2720: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2730: 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  ocking */.#defin
2740: 65 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  e UNIXFILE_WARNE
2750: 44 20 20 20 20 30 78 30 31 30 30 20 20 20 20 20  D    0x0100     
2760: 2f 2a 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  /* verifyDbFile(
2770: 29 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65 20  ) warnings have 
2780: 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a  been issued */..
2790: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
27a0: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
27b0: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
27c0: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
27d0: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
27e0: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
27f0: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
2800: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
2810: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
2820: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
2830: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
2840: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
2850: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2860: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
2870: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
2880: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
2890: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
28a0: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
28b0: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
28c0: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
28d0: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
28e0: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
28f0: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
2900: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
2910: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2920: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2930: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
2940: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
2950: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
2960: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
2970: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
2980: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
2990: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
29a0: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
29b0: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
29c0: 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  .** HAVE_MREMAP 
29d0: 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65  defaults to true
29e0: 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61   on Linux and fa
29f0: 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65  lse everywhere e
2a00: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  lse..*/.#if !def
2a10: 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50  ined(HAVE_MREMAP
2a20: 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f  ).# if defined(_
2a30: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
2a40: 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45  ined(_GNU_SOURCE
2a50: 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  ).#  define HAVE
2a60: 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65  _MREMAP 1.# else
2a70: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
2a80: 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66  MREMAP 0.# endif
2a90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
2aa0: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2ab0: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2ac0: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2ad0: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ae0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2af0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2b00: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2b10: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2b20: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2b30: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2b40: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2b50: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2b60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2b70: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2b80: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2b90: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2ba0: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2bb0: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2bc0: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2bd0: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2be0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2bf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2c00: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2c10: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2c20: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2c30: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2c40: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2c50: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  e);.}../*.** On 
2c60: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
2c70: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
2c80: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
2c90: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
2ca0: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
2cb0: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
2cc0: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
2cd0: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
2ce0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
2cf0: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
2d00: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
2d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2d20: 69 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  ixFchown(int fd,
2d30: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
2d40: 74 20 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  t gid){.  return
2d50: 20 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a   geteuid() ? 0 :
2d60: 20 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67   fchown(fd,uid,g
2d70: 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  id);.}../* Forwa
2d80: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2d90: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2da0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2db0: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a  har*, int*);../*
2dc0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
2dd0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
2de0: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
2df0: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
2e00: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
2e10: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
2e20: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2e30: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
2e40: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
2e50: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
2e60: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
2e70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
2e80: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
2e90: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2ea0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2eb0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2ec0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
2ed0: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
2ee0: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
2ef0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
2f00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2f10: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2f20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2f30: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
2f40: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
2f50: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
2f60: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
2f70: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
2f80: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
2f90: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
2fa0: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20  Syscall[] = {.  
2fb0: 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20  { "open",       
2fc0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2fd0: 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e  ll_ptr)posixOpen
2fe0: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
2ff0: 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69   osOpen      ((i
3000: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3010: 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63  *,int,int))aSysc
3020: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
3030: 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20  ..  { "close",  
3040: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3050: 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65  yscall_ptr)close
3060: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3070: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20  fine osClose    
3080: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61   ((int(*)(int))a
3090: 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72  Syscall[1].pCurr
30a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73  ent)..  { "acces
30b0: 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  s",       (sqlit
30c0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61  e3_syscall_ptr)a
30d0: 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c  ccess,     0  },
30e0: 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73  .#define osAcces
30f0: 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f  s    ((int(*)(co
3100: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61  nst char*,int))a
3110: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
3120: 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77  ent)..  { "getcw
3130: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3140: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67  e3_syscall_ptr)g
3150: 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c  etcwd,     0  },
3160: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77  .#define osGetcw
3170: 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28  d    ((char*(*)(
3180: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
3190: 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65  yscall[3].pCurre
31a0: 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c  nt)..  { "stat",
31b0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
31c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74  3_syscall_ptr)st
31d0: 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  at,       0  },.
31e0: 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20  #define osStat  
31f0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3200: 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20  st char*,struct 
3210: 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  stat*))aSyscall[
3220: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a  4].pCurrent)../*
3230: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
3240: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
3250: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
3260: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
3270: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
3280: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
3290: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
32a0: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
32b0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
32c0: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
32d0: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
32e0: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
32f0: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
3300: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
3310: 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20  t is DOS - what 
3320: 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a  did you expect?.
3330: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50  */.#ifdef __DJGP
3340: 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c  P__.  { "fstat",
3350: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
3360: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c             0  },
3370: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
3380: 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c  (a,b,c)    0.#el
3390: 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74  se     .  { "fst
33a0: 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  at",        (sql
33b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33c0: 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20  )fstat,      0  
33d0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
33e0: 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  at     ((int(*)(
33f0: 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a  int,struct stat*
3400: 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43  ))aSyscall[5].pC
3410: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
3420: 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c    { "ftruncate",
3430: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3440: 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61  call_ptr)ftrunca
3450: 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  te,  0  },.#defi
3460: 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28  ne osFtruncate (
3470: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f  (int(*)(int,off_
3480: 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  t))aSyscall[6].p
3490: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
34a0: 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73  cntl",        (s
34b0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34c0: 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30  tr)fcntl,      0
34d0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
34e0: 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a  cntl     ((int(*
34f0: 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61  )(int,int,...))a
3500: 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72  Syscall[7].pCurr
3510: 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22  ent)..  { "read"
3520: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3530: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72  e3_syscall_ptr)r
3540: 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  ead,       0  },
3550: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20  .#define osRead 
3560: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3570: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3580: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  _t))aSyscall[8].
3590: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
35a0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
35b0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
35c0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
35d0: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
35e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35f0: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c  scall_ptr)pread,
3600: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73        0  },.#els
3610: 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  e.  { "pread",  
3620: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3630: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3640: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3650: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
3660: 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ead     ((ssize_
3670: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
3680: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
3690: 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e  scall[9].pCurren
36a0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
36b0: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
36c0: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
36d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
36e0: 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20  l_ptr)pread64,  
36f0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3700: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3710: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3720: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3730: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3740: 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36  #define osPread6
3750: 34 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  4   ((ssize_t(*)
3760: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
3770: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3780: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
3790: 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20  .  { "write",   
37a0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
37b0: 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c  scall_ptr)write,
37c0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
37d0: 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20  ine osWrite     
37e0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
37f0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3800: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  e_t))aSyscall[11
3810: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3820: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3830: 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  AD) || SQLITE_EN
3840: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
3850: 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  LE.  { "pwrite",
3860: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3870: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69  syscall_ptr)pwri
3880: 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  te,     0  },.#e
3890: 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22  lse.  { "pwrite"
38a0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
38b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
38c0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
38d0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
38e0: 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a  Pwrite    ((ssiz
38f0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
3900: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66   void*,size_t,of
3910: 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20  f_t))\.         
3920: 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63             aSysc
3930: 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74  all[12].pCurrent
3940: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3950: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
3960: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
3970: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3980: 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20  _ptr)pwrite64,  
3990: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
39a0: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
39b0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
39c0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
39d0: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
39e0: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36  define osPwrite6
39f0: 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  4  ((ssize_t(*)(
3a00: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3a10: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d      aSyscall[13]
3a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3a50: 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20  "fchmod",       
3a60: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3a70: 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20  _ptr)fchmod,    
3a80: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3a90: 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74  sFchmod    ((int
3aa0: 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29  (*)(int,mode_t))
3ab0: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
3ac0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3ad0: 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
3ae0: 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
3af0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3b00: 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  E.  { "fallocate
3b10: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3b20: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
3b30: 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d  _fallocate,  0 }
3b40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c  ,.#else.  { "fal
3b50: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
3b60: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b70: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3b80: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3b90: 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61  define osFalloca
3ba0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
3bb0: 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  off_t,off_t))aSy
3bc0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
3bd0: 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b  nt)..  { "unlink
3be0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3bf0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
3c00: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20  link,           
3c10: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55  0 },.#define osU
3c20: 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a  nlink    ((int(*
3c30: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
3c40: 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72  Syscall[16].pCur
3c50: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e  rent)..  { "open
3c60: 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28  Directory",    (
3c70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c80: 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72  ptr)openDirector
3c90: 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  y,      0 },.#de
3ca0: 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63  fine osOpenDirec
3cb0: 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f  tory ((int(*)(co
3cc0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29  nst char*,int*))
3cd0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3ce0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64  rrent)..  { "mkd
3cf0: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3d00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3d10: 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20  )mkdir,         
3d20: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3d30: 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74  sMkdir     ((int
3d40: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
3d50: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3d60: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
3d70: 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20    { "rmdir",    
3d80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3d90: 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20  call_ptr)rmdir, 
3da0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3db0: 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20  define osRmdir  
3dc0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3dd0: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3de0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
3df0: 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20  .  { "fchown",  
3e00: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e10: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 46  scall_ptr)posixF
3e20: 63 68 6f 77 6e 2c 20 20 20 20 20 30 20 7d 2c 0a  chown,     0 },.
3e30: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e  #define osFchown
3e40: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3e50: 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53  ,uid_t,gid_t))aS
3e60: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
3e70: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
3e80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
3e90: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
3ea0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
3eb0: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
3ec0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3ed0: 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30  _ptr)mmap,     0
3ee0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d   },.#define osMm
3ef0: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
3f00: 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69  id*,size_t,int,i
3f10: 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  nt,int,off_t))aS
3f20: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3f30: 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61  ent)..  { "munma
3f40: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3f50: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3f60: 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  unmap,          
3f70: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d  0 },.#define osM
3f80: 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  unmap ((void*(*)
3f90: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
3fa0: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
3fb0: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
3fc0: 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d  MREMAP.  { "mrem
3fd0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
3fe0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3ff0: 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mremap,         
4000: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4010: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4020: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4030: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
4040: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4050: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d  f.#define osMrem
4060: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
4070: 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f  id*,size_t,size_
4080: 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63  t,int,...))aSysc
4090: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
40a0: 29 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20  ).#endif..}; /* 
40b0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
40c0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
40d0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
40e0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
40f0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
4100: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
4110: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
4120: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
4130: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4140: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
4150: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
4160: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
4170: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
4180: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
4190: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
41a0: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
41b0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
41c0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
41d0: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
41e0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
41f0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
4200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
4210: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
4220: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
4230: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
4240: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4250: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
4260: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
4270: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4280: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
4290: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
42a0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
42b0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
42c0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
42d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
42e0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
42f0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
4300: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
4310: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4320: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
4330: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
4340: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
4350: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
4360: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
4370: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
4380: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
4390: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
43a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
43b0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
43c0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
43d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
43e0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
43f0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
4400: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4410: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
4420: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
4430: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4440: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4450: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4460: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4470: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4480: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4490: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
44a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
44b0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
44c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
44d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
44e0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
44f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4500: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
4510: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4520: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
4530: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4540: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4550: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4560: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4570: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4580: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4590: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
45a0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
45b0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
45c0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
45d0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
45e0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
45f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4600: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4620: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
4630: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4640: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4650: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4660: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4670: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4680: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4690: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
46a0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
46b0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
46c0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
46d0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
46e0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
46f0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4700: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4710: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
4720: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
4730: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4740: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4750: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4760: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4770: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4780: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4790: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
47a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
47b0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
47c0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
47d0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
47e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
47f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4800: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4810: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
4820: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
4830: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4840: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4850: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4860: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4870: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4880: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4890: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
48a0: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
48b0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
48c0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
48d0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
48e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
48f0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
4900: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
4910: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4920: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4930: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4940: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4950: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4960: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4970: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4990: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
49a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
49b0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
49c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
49d0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
49e0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
49f0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
4a00: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
4a10: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4a20: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
4a30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4a40: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63  /*.** Do not acc
4a50: 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73  ept any file des
4a60: 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61  criptor less tha
4a70: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e  n this value, in
4a80: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a   order to avoid.
4a90: 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62  ** opening datab
4aa0: 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66  ase file using f
4ab0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4ac0: 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c  that are commonl
4ad0: 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73  y used for .** s
4ae0: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
4af0: 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72  utput, and error
4b00: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
4b10: 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45  ITE_MINIMUM_FILE
4b20: 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65  _DESCRIPTOR.# de
4b30: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49  fine SQLITE_MINI
4b40: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
4b50: 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TOR 3.#endif../*
4b60: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28  .** Invoke open(
4b70: 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70  ).  Do so multip
4b80: 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20  le times, until 
4b90: 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65  it either succee
4ba0: 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66  ds or.** fails f
4bb0: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f  or some reason o
4bc0: 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e  ther than EINTR.
4bd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
4be0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
4bf0: 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73   "m" is 0 then s
4c00: 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  et it to the def
4c10: 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69  ault for.** SQLi
4c20: 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  te.  The default
4c30: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55   is SQLITE_DEFAU
4c40: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
4c50: 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ONS (normally.**
4c60: 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69   0644) as modifi
4c70: 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ed by the system
4c80: 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73   umask.  If m is
4c90: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20   not 0, then.** 
4ca0: 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72  make the file cr
4cb0: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65  eation mode be e
4cc0: 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e  xactly m ignorin
4cd0: 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a  g the umask..**.
4ce0: 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74  ** The m paramet
4cf0: 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a  er will be non-z
4d00: 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72  ero only when cr
4d10: 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f  eating -wal, -jo
4d20: 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73  urnal,.** and -s
4d30: 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61  hm files.  We wa
4d40: 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74  nt those files t
4d50: 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a  o have *exactly*
4d60: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72   the same.** per
4d70: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69  missions as thei
4d80: 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  r original datab
4d90: 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74  ase, unadulterat
4da0: 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
4db0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c  .** In that way,
4dc0: 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
4dd0: 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77  ile is -rw-rw-rw
4de0: 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61   or -rw-rw-r-, a
4df0: 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74  nd a.** transact
4e00: 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20  ion crashes and 
4e10: 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f  leaves behind ho
4e20: 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
4e30: 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20   any.** process 
4e40: 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20  that is able to 
4e50: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
4e60: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20  abase will also 
4e70: 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65  be able to.** re
4e80: 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f  cover the hot jo
4e90: 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  urnals..*/.stati
4ea0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
4eb0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
4ec0: 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d   int f, mode_t m
4ed0: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d  ){.  int fd;.  m
4ee0: 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d  ode_t m2 = m ? m
4ef0: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
4f00: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
4f10: 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  NS;.  while(1){.
4f20: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
4f30: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
4f40: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
4f50: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
4f60: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
4f70: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
4f80: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
4f90: 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
4fa0: 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75  =EINTR ) continu
4fb0: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
4fc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
4fd0: 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  >=SQLITE_MINIMUM
4fe0: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
4ff0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73   ) break;.    os
5000: 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73  Close(fd);.    s
5010: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5020: 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20  E_WARNING, .    
5030: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74              "att
5040: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25  empt to open \"%
5050: 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63  s\" as file desc
5060: 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66  riptor %d", z, f
5070: 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b  d);.    fd = -1;
5080: 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28  .    if( osOpen(
5090: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20  "/dev/null", f, 
50a0: 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m)<0 ) break;.  
50b0: 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  }.  if( fd>=0 ){
50c0: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
50d0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
50e0: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
50f0: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
5100: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
5110: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
5120: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
5130: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
5140: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
5150: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
5160: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
5170: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
5180: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
5190: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
51a0: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
51b0: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
51c0: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
51d0: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
51e0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
51f0: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
5200: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
5210: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
5220: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
5230: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
5240: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
5250: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
5260: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
5270: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
5280: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
5290: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
52a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
52b0: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
52c0: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
52d0: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
52e0: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
52f0: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
5300: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
5310: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
5320: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
5330: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
5340: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
5350: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
5360: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5370: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
5380: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
5390: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
53a0: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
53b0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
53c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
53d0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
53e0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
53f0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
5400: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5410: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
5420: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5430: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
5440: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
5450: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
5460: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
5470: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
5480: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
5490: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
54a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
54b0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
54c0: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
54d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
54e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
54f0: 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
5500: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5510: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
5520: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5530: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5540: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
5550: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66  #endif...#if def
5560: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
5570: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5580: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
5590: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
55a0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
55b0: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
55c0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
55d0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
55e0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
55f0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
5600: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
5610: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
5620: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
5630: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5640: 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74   *azFileLock(int
5650: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73   eFileLock){.  s
5660: 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b  witch( eFileLock
5670: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f   ){.    case NO_
5680: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
5690: 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48  NE";.    case SH
56a0: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
56b0: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20  n "SHARED";.    
56c0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
56d0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
56e0: 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  RVED";.    case 
56f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
5700: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
5710: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
5720: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
5730: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
5740: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
5750: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ";.}.#endif..#if
5760: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
5770: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
5780: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
5790: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
57a0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
57b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
57c0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
57d0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
57e0: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
57f0: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
5800: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
5810: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
5820: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
5830: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
5840: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
5850: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
5860: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
5870: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
5880: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
5890: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
58a0: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
58b0: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
58c0: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
58d0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
58e0: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
58f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
5900: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
5910: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
5920: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
5930: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
5940: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
5950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
5960: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5970: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
5980: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
5990: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
59a0: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
59b0: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
59c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
59d0: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
59e0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
59f0: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
5a00: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5a10: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
5a20: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
5a30: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
5a40: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
5a50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
5a60: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
5a70: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
5a80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
5a90: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
5aa0: 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63  ET );.  s = osFc
5ab0: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
5ac0: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
5ad0: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
5ae0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
5af0: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
5b00: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
5b10: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
5b20: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
5b30: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
5b40: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
5b50: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
5b60: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
5b70: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
5b80: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
5b90: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
5ba0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
5bb0: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
5bc0: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
5bd0: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46  l2 = *p;.    osF
5be0: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
5bf0: 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20  , &l2);.    if( 
5c00: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  l2.l_type==F_RDL
5c10: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5c20: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20  e = "RDLCK";.   
5c30: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5c40: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
5c50: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5c60: 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  WRLCK";.    }els
5c70: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
5c80: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
5c90: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
5ca0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
5cb0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
5cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5cd0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
5ce0: 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61  cntl-failure-rea
5cf0: 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64  son: %s %d %d %d
5d00: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70  \n",.       zTyp
5d10: 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61  e, (int)l2.l_sta
5d20: 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65  rt, (int)l2.l_le
5d30: 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64  n, (int)l2.l_pid
5d40: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d  );.  }.  errno =
5d50: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72   savedErrno;.  r
5d60: 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65  eturn s;.}.#unde
5d70: 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e  f osFcntl.#defin
5d80: 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72  e osFcntl lockTr
5d90: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
5da0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
5db0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  */../*.** Retry 
5dc0: 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  ftruncate() call
5dd0: 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20  s that fail due 
5de0: 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74  to EINTR.*/.stat
5df0: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
5e00: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
5e10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
5e20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
5e30: 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61  { rc = osFtrunca
5e40: 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65  te(h,sz); }while
5e50: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
5e60: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
5e70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5e80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
5e90: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
5ea0: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
5eb0: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
5ec0: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
5ed0: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
5ee0: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
5ef0: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
5f00: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
5f10: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
5f20: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
5f30: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
5f40: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
5f50: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
5f60: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
5f70: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
5f80: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
5f90: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
5fa0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
5fb0: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
5fc0: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
5fd0: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
5fe0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5ff0: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
6000: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
6010: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
6020: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
6030: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
6040: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
6050: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
6060: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
6070: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
6080: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
6090: 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20  Error) {.#if 0. 
60a0: 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
60b0: 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e   this code was n
60c0: 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74  ot commented out
60d0: 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69  . In theory, thi
60e0: 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68  s branch.  ** sh
60f0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69  ould never be hi
6100: 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  t, as this funct
6110: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
6120: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a  be called after.
6130: 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72    ** a locking-r
6140: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  elated function 
6150: 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68  (i.e. fcntl()) h
6160: 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  as returned non-
6170: 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74  zero with.  ** t
6180: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
6190: 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  o as the first a
61a0: 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61  rgument. Since a
61b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73   system call has
61c0: 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72   failed,.  ** er
61d0: 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  rno should be no
61e0: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  n-zero..  **.  *
61f0: 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20  * Despite this, 
6200: 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20  if errno really 
6210: 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c  is zero, we stil
6220: 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  l don't want to 
6230: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
6240: 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65  TE_OK. The syste
6250: 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61  m call failed, a
6260: 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65  nd *some* SQLite
6270: 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65   error should be
6280: 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64  .  ** propagated
6290: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c   back to the cal
62a0: 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20  ler. Commenting 
62b0: 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20  this branch out 
62c0: 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20  means errno==0. 
62d0: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64   ** will be hand
62e0: 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61  led by the "defa
62f0: 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77  ult:" case below
6300: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a  ..  */.  case 0:
6310: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
6320: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
6330: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
6340: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
6350: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
6360: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
6370: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
6380: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
6390: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
63a0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
63b0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
63c0: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
63d0: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
63e0: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
63f0: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6400: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6410: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6420: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
6430: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
6440: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
6450: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
6460: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
6470: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
6480: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
6490: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
64a0: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  ERR_LOCK) || .  
64b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
64c0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
64d0: 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20  RR_UNLOCK) || . 
64e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
64f0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6500: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20  ERR_RDLOCK) ||. 
6510: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6520: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6530: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
6540: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
6550: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
6560: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
6570: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
6580: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
6590: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
65a0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
65b0: 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69   .  /* EDEADLK i
65c0: 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
65d0: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e  if a call to fcn
65e0: 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20  tl(F_SETLKW) is 
65f0: 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74  made. And.  ** t
6600: 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  his module never
6610: 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61   makes such a ca
6620: 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65  ll. And the code
6630: 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c   in SQLite itsel
6640: 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20  f .  ** asserts 
6650: 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  that SQLITE_IOER
6660: 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76  R_BLOCKED is nev
6670: 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72  er returned. For
6680: 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20   these reasons. 
6690: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73   ** this case is
66a0: 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
66b0: 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74  out. If the syst
66c0: 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e  em does set errn
66d0: 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20  o to EDEADLK,.  
66e0: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53  ** the default S
66f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
6700: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74  code will be ret
6710: 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a  urned. */.#if 0.
6720: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
6730: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6740: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
6750: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
6760: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
6770: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
6780: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
6790: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
67a0: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
67b0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
67c0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
67d0: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
67e0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
67f0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6800: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6810: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
6820: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
6830: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
6840: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
6850: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
6860: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
6870: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
6880: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
6890: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
68a0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
68b0: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
68c0: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
68d0: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
68e0: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
68f0: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
6900: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
6910: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
6920: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6940: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
6950: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
6960: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
6970: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
6980: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
6990: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
69a0: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
69b0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
69c0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
69d0: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
69e0: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
69f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
6a00: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a  rr;.  }.}.../***
6a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
6a70: 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65  egin Unique File
6a80: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
6a90: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
6ab0: 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f  * On most versio
6ac0: 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63  ns of unix, we c
6ad0: 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20  an get a unique 
6ae0: 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79  ID for a file by
6af0: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a   concatenating.*
6b00: 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d  * the device num
6b10: 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64  ber and the inod
6b20: 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74  e number.  But t
6b30: 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  his does not wor
6b40: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
6b50: 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75   On VxWorks, a u
6b60: 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75  nique file id mu
6b70: 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  st be based on t
6b80: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
6b90: 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  ename..**.** A p
6ba0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
6bb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
6bc0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6bd0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
6be0: 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65  a.** unique file
6bf0: 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20   ID in VxWorks. 
6c00: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
6c10: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
6c20: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63   contains.** a c
6c30: 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  opy of the canon
6c40: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20  ical filename.  
6c50: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
6c60: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e  reference count.
6c70: 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74    .** The struct
6c80: 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64  ure is reclaimed
6c90: 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
6ca0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
6cb0: 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a  it drops to.** z
6cc0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ero..**.** There
6cd0: 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20   are never very 
6ce0: 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20  many files open 
6cf0: 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20  at one time and 
6d00: 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a  lookups are not.
6d10: 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ** a performance
6d20: 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20  -critical path, 
6d30: 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69  so it is suffici
6d40: 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65  ent to put these
6d50: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f  .** structures o
6d60: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  n a linked list.
6d70: 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72  .*/.struct vxwor
6d80: 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72  ksFileId {.  str
6d90: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6da0: 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65  d *pNext;  /* Ne
6db0: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  xt in a list of 
6dc0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e  them all */.  in
6dd0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6df0: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
6e00: 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20  ces to this one 
6e10: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6e40: 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  the zCanonicalNa
6e50: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  me[] string */. 
6e60: 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61   char *zCanonica
6e70: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  lName;         /
6e80: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * Canonical file
6e90: 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  name */.};..#if 
6ea0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a  OS_VXWORKS./* .*
6eb0: 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c  * All unique fil
6ec0: 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20  enames are held 
6ed0: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6ee0: 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a   headed by this.
6ef0: 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a  ** variable:.*/.
6f00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6f10: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6f20: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30  orksFileList = 0
6f30: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  ;../*.** Simplif
6f40: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  y a filename int
6f50: 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20  o its canonical 
6f60: 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e  form.** by makin
6f70: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
6f80: 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  changes:.**.**  
6f90: 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74  * removing any t
6fa0: 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c  railing and dupl
6fb0: 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f  icate /.**  * co
6fc0: 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a  nvert /./ into j
6fd0: 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ust /.**  * conv
6fe0: 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65  ert /A/../ where
6ff0: 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65   A is any simple
7000: 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20   name into just 
7010: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
7020: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
7030: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
7040: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
7050: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
7060: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
7070: 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65  n z[0..n-1].  Re
7080: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7090: 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  of.** characters
70a0: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69   in the simplifi
70b0: 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  ed name..*/.stat
70c0: 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69  ic int vxworksSi
70d0: 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20  mplifyName(char 
70e0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
70f0: 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28  t i, j;.  while(
7100: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
7110: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
7120: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
7130: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
7140: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
7150: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
7160: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7170: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
7180: 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a  .' && i+2<n && z
7190: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
71a0: 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
71b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
71c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
71d0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
71e0: 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+3<n && z[i+2]
71f0: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d  =='.' && z[i+3]=
7200: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
7210: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b  while( j>0 && z[
7220: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
7230: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
7240: 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  j>0 ){ j--; }.  
7250: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
7260: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7270: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7280: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
7290: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
72a0: 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
72b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69  /*.** Find a uni
72c0: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
72d0: 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75  the given absolu
72e0: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
72f0: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
7300: 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73  r to the vxworks
7310: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7320: 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20  This pointer is 
7330: 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69  the unique.** fi
7340: 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  le ID..**.** The
7350: 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74   nRef field of t
7360: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
7370: 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65   object is incre
7380: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  mented before.**
7390: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72   the object is r
73a0: 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20  eturned.  A new 
73b0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
73c0: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
73d0: 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ** and added to 
73e0: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
73f0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
7400: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
7410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7420: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
7430: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
7440: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7450: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e  leId *vxworksFin
7460: 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68  dFileId(const ch
7470: 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  ar *zAbsoluteNam
7480: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  e){.  struct vxw
7490: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77  orksFileId *pNew
74a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61  ;         /* sea
74b0: 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20  rch key and new 
74c0: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72  file ID */.  str
74d0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
74e0: 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20  d *pCandidate;  
74f0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
7500: 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69  over existing fi
7510: 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  le IDs */.  int 
7520: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62  /* Length of zAb
7550: 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e  soluteName strin
7560: 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
7570: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d  zAbsoluteName[0]
7580: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28  =='/' );.  n = (
7590: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f  int)strlen(zAbso
75a0: 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  luteName);.  pNe
75b0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
75c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
75d0: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
75e0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
75f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
7600: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
7610: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
7620: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
7630: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7640: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
7650: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
7660: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
7670: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7680: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
7690: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
76a0: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
76b0: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
76c0: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
76d0: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
76e0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
76f0: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
7700: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7710: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
7720: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
7730: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
7740: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
7750: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
7760: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
7770: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
7780: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
7790: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
77a0: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
77b0: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
77c0: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
77d0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
77e0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
77f0: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
7800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
7810: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
7820: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
7830: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
7840: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
7850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
7860: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
7870: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
7880: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
7890: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
78a0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
78b0: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
78c0: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
78d0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
78e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
78f0: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
7900: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
7910: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7920: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7930: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
7940: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
7950: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
7960: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
7970: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
7980: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
7990: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
79a0: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
79b0: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
79c0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
79d0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
79e0: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
79f0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7a00: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
7a10: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
7a20: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
7a30: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
7a40: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7a50: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
7a60: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
7a70: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
7a80: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
7a90: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
7aa0: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
7ab0: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
7ac0: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
7ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7ae0: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
7af0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7b00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
7b10: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
7b30: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
7b40: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
7b50: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
7b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
7b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
7bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c20: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
7c30: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
7c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
7c60: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
7c70: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
7c80: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
7c90: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
7ca0: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
7cb0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
7cc0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
7cd0: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
7ce0: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
7cf0: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
7d00: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
7d10: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
7d20: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
7d30: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
7d40: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
7d50: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
7d60: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
7d70: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
7d80: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
7d90: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
7da0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
7db0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
7dc0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7dd0: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
7de0: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
7df0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
7e00: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
7e10: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
7e20: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
7e30: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
7e40: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
7e50: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
7e60: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
7e70: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
7e80: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
7e90: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
7ea0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
7eb0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
7ec0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
7ed0: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
7ee0: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
7ef0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
7f00: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
7f10: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
7f20: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
7f30: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
7f40: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
7f50: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
7f60: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
7f70: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
7f80: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
7f90: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
7fa0: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
7fb0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
7fc0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
7fd0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7fe0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
7ff0: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
8000: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
8010: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
8020: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
8030: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
8040: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
8050: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
8060: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
8070: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
8080: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
8090: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
80a0: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
80b0: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
80c0: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
80d0: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
80e0: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
80f0: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
8100: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
8110: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
8120: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
8130: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
8140: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
8150: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
8160: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
8170: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
8180: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
8190: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
81a0: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
81b0: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
81c0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
81d0: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
81e0: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
81f0: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
8200: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8210: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
8220: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
8230: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
8240: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
8250: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
8260: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
8270: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
8280: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
8290: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
82a0: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
82b0: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
82c0: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
82d0: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
82e0: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
82f0: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
8300: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
8310: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
8320: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
8330: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
8340: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
8350: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
8360: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
8370: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
8380: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
8390: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
83a0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
83b0: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
83c0: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
83d0: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
83e0: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
83f0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
8400: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
8410: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
8420: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8430: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
8440: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
8450: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
8460: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
8470: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
8480: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
8490: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
84a0: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
84b0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
84c0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
84d0: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
84e0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
84f0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
8500: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
8510: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
8520: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
8530: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
8540: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
8550: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
8560: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
8570: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
8580: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
8590: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
85a0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
85b0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
85c0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
85d0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
85e0: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
85f0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
8600: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
8610: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
8620: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
8630: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
8640: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
8650: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
8660: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
8670: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
8680: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
8690: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
86a0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
86b0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
86c0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
86d0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
86e0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
86f0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
8700: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
8710: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
8720: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
8730: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
8740: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
8750: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
8760: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
8770: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
8780: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
8790: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
87a0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
87b0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
87c0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
87d0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
87e0: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
87f0: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
8800: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
8810: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
8820: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
8830: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8840: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
8850: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
8860: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
8870: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
8880: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
8890: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
88a0: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
88b0: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
88c0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
88d0: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
88e0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
88f0: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
8900: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
8910: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
8920: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
8930: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
8940: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
8950: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
8960: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
8970: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
8980: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
8990: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
89a0: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
89b0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
89c0: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
89d0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
89e0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
89f0: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
8a00: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
8a10: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
8a20: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
8a30: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
8a40: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
8a50: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
8a60: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
8a70: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
8a80: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
8a90: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
8aa0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
8ab0: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
8ac0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
8ad0: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
8ae0: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
8af0: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
8b00: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
8b10: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
8b20: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
8b30: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
8b40: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
8b50: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
8b60: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
8b70: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
8b80: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
8b90: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
8ba0: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
8bb0: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
8bc0: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
8bd0: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
8be0: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
8bf0: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
8c00: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
8c10: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
8c20: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
8c30: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
8c40: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
8c50: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
8c60: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
8c70: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
8c80: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
8c90: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
8ca0: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
8cb0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
8cc0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
8cd0: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
8ce0: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
8cf0: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
8d00: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
8d10: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
8d20: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
8d30: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
8d40: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
8d50: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
8d60: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
8d70: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
8d80: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
8d90: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
8da0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
8db0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
8dc0: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
8dd0: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
8de0: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
8df0: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
8e00: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
8e10: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
8e20: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
8e30: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
8e40: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
8e50: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
8e60: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
8e70: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
8e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
8e90: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
8ea0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
8eb0: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
8ec0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8ed0: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
8ee0: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
8ef0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
8f00: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
8f10: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
8f20: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
8f30: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
8f40: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
8f50: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
8f60: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
8f70: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
8f80: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8fa0: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
8fb0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
8fc0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
8fd0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
8fe0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
8ff0: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
9000: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
9010: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
9020: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
9030: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
9040: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
9050: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
9060: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
9070: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
9080: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
9090: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
90a0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
90b0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
90c0: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
90d0: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
90e0: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
90f0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
9100: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
9110: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
9120: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
9130: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
9140: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
9150: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
9160: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
9170: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
9180: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
9190: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
91a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
91b0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
91c0: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
91d0: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
91e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
91f0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
9200: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
9210: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
9220: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
9230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9240: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
9250: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
9260: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
9270: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
9280: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
9290: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
92a0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
92b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
92c0: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
92d0: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
92e0: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
92f0: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
9300: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9320: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
9330: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
9340: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
9350: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
9360: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
9370: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
9380: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
9390: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
93a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
93b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
93c0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
93d0: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
93e0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
93f0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
9400: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
9410: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
9420: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
9430: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
9440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
9450: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
9460: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
9470: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9480: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
9490: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
94a0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
94b0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
94c0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
94d0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
94e0: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
94f0: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
9500: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
9510: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
9520: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
9530: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9550: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
9560: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
9570: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
9580: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
9590: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
95a0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
95b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
95c0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
95d0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
95e0: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
95f0: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
9600: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
9610: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
9620: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
9630: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
9640: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
9650: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
9660: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
9670: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
9680: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
9690: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
96a0: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
96b0: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
96c0: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
96d0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
96e0: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
96f0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
9700: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
9710: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
9720: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
9730: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
9740: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9750: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
9760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
9770: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
9780: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
9790: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
97a0: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
97b0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
97c0: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
97d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
97e0: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
97f0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
9800: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
9810: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
9820: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
9830: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
9840: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
9850: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
9860: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
9870: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
9880: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
9890: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
98a0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
98b0: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
98c0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
98d0: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
98e0: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
98f0: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
9900: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9920: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
9930: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9940: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
9950: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9960: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
9970: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
9980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
9990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
99a0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
99b0: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
99c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
99f0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
9a00: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
9a10: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
9a20: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
9a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
9a40: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
9a50: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
9a60: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
9a70: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
9a80: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
9a90: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
9aa0: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
9ab0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
9ac0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9ad0: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
9ae0: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
9af0: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
9b00: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
9b10: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
9b20: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
9b30: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
9b40: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
9b50: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
9b60: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
9b70: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
9b80: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
9b90: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
9ba0: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
9bb0: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
9bc0: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
9bd0: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
9be0: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
9bf0: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
9c00: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
9c10: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
9c20: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
9c30: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
9c40: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
9c50: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
9c60: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
9c70: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
9c80: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
9c90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
9ca0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
9cb0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9cc0: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
9cd0: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
9ce0: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
9cf0: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
9d00: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
9d10: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
9d20: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
9d30: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
9d40: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
9d50: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9d60: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
9d70: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
9d80: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
9d90: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9da0: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
9db0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
9dc0: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
9dd0: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
9de0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9df0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
9e00: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
9e10: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
9e20: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
9e30: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
9e40: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
9e50: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
9e60: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
9e70: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
9e80: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
9e90: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
9ea0: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
9eb0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
9ec0: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
9ed0: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
9ee0: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
9ef0: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
9f00: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
9f10: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
9f20: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
9f30: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
9f40: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
9f50: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9f60: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
9f70: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
9f80: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
9f90: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
9fa0: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
9fb0: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
9fc0: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
9fd0: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
9fe0: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
9ff0: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
a000: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
a010: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
a020: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
a030: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
a040: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
a050: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
a060: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
a070: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
a080: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
a090: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
a0a0: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
a0b0: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
a0c0: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
a0d0: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
a0e0: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
a0f0: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
a100: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
a110: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
a120: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
a130: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
a140: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
a150: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
a160: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
a170: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
a180: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
a190: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
a1a0: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
a1b0: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
a1c0: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
a1d0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
a1e0: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
a1f0: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
a200: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
a210: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
a220: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
a230: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
a240: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
a250: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
a260: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
a270: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
a280: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
a290: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
a2a0: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
a2b0: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
a2c0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
a2d0: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
a2e0: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
a2f0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
a300: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
a310: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
a320: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
a330: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
a340: 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69   all file descri
a350: 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64  ptors accumuated
a360: 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64   in the unixInod
a370: 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c  eInfo->pUnused l
a380: 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ist..*/ .static 
a390: 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e  void closePendin
a3a0: 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  gFds(unixFile *p
a3b0: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
a3c0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
a3d0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
a3e0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
a3f0: 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  p;.  UnixUnusedF
a400: 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  d *pNext;.  for(
a410: 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  p=pInode->pUnuse
a420: 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  d; p; p=pNext){.
a430: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
a440: 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74  Next;.    robust
a450: 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d  _close(pFile, p-
a460: 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  >fd, __LINE__);.
a470: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a480: 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64  (p);.  }.  pInod
a490: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
a4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
a4b0: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
a4c0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
a4d0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
a4e0: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
a4f0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
a500: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
a510: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
a520: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
a530: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
a540: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
a550: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
a560: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
a570: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
a580: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
a590: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a5a0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a5b0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
a5c0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
a5d0: 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  () );.  if( ALWA
a5e0: 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20  YS(pInode) ){.  
a5f0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
a600: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
a610: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
a620: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a630: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
a640: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
a650: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
a660: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
a670: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
a680: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a690: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  e->pPrev->pNext=
a6a0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a6b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
a6c0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
a6d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a6e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
a6f0: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d  sert( inodeList=
a700: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a710: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
a720: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a730: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a740: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b  pInode->pNext ){
a750: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a760: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
a770: 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b  pPrev==pInode );
a780: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
a790: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a7a0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20  pInode->pPrev;. 
a7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a7c0: 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65  ite3_free(pInode
a7d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a7e0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
a7f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
a800: 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e  ocate the unixIn
a810: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  odeInfo object t
a820: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
a830: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
a840: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61  iptor.  Create a
a850: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
a860: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
a870: 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68  eturn value migh
a880: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
a890: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
a8a0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ccurs..**.** The
a8b0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
a8c0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
a8d0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
a8e0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
a8f0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
a900: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
a910: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
a920: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
a930: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
a940: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65  ic int findInode
a950: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
a960: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
a970: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
a980: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
a990: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
a9a0: 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ey */.  unixInod
a9b0: 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20  eInfo **ppInode 
a9c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
a9d0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a9e0: 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a  fo object here *
a9f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
aa20: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
aa30: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
aa60: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
aa70: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
aa80: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
aa90: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
aaa0: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
aab0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f  unixInodeInfo */
aac0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
aad0: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
aae0: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
aaf0: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
ab00: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
ab10: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20  fo *pInode = 0; 
ab20: 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65      /* Candidate
ab30: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
ab40: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65  bject */..  asse
ab50: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
ab60: 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  d() );..  /* Get
ab70: 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72   low-level infor
ab80: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
ab90: 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61   file that we ca
aba0: 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63  n used to.  ** c
abb0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e  reate a unique n
abc0: 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ame for the file
abd0: 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46  ..  */.  fd = pF
abe0: 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f  ile->h;.  rc = o
abf0: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
ac00: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
ac10: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
ac20: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
ac30: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
ac40: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
ac50: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
ac60: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
ac70: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
ac80: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
ac90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
aca0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
acb0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
acc0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
acd0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
ace0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
acf0: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
ad00: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
ad10: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
ad20: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
ad30: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
ad40: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
ad50: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
ad60: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
ad70: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
ad80: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
ad90: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
ada0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
adb0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
adc0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
add0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
ade0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
adf0: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
ae00: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
ae10: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
ae20: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
ae30: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
ae40: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
ae50: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
ae60: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
ae70: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
ae80: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
ae90: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
aea0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
aeb0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
aec0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
aed0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
aee0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
aef0: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
af00: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
af10: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
af20: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
af30: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
af40: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
af50: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
af60: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
af70: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
af80: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
af90: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
afa0: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
afb0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
afc0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
afd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
afe0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
aff0: 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  }.    rc = osFst
b000: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
b010: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
b020: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
b030: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
b040: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
b050: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
b060: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
b070: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
b080: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
b090: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
b0a0: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
b0b0: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
b0c0: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
b0d0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
b0e0: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
b0f0: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
b100: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  no;.#endif.  pIn
b110: 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
b120: 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65  .  while( pInode
b130: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
b140: 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  Id, &pInode->fil
b150: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
b160: 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  Id)) ){.    pIno
b170: 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
b180: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  xt;.  }.  if( pI
b190: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  node==0 ){.    p
b1a0: 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  Inode = sqlite3_
b1b0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
b1c0: 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69  pInode) );.    i
b1d0: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
b1e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b1f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
b200: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
b210: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
b220: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
b230: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
b240: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
b250: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
b260: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20     pInode->nRef 
b270: 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  = 1;.    pInode-
b280: 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69  >pNext = inodeLi
b290: 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  st;.    pInode->
b2a0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
b2b0: 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69  f( inodeList ) i
b2c0: 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20  nodeList->pPrev 
b2d0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e  = pInode;.    in
b2e0: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
b2f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b300: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Inode->nRef++;. 
b310: 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20   }.  *ppInode = 
b320: 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e  pInode;.  return
b330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b340: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
b350: 20 69 66 20 70 46 69 6c 65 20 68 61 73 20 62 65   if pFile has be
b360: 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e  en renamed or un
b370: 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20  linked since it 
b380: 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
b390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b3a0: 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69  fileHasMoved(uni
b3b0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
b3c0: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
b3d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  ;.  return pFile
b3e0: 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20  ->pInode!=0 &&. 
b3f0: 20 20 20 20 20 20 20 20 28 6f 73 53 74 61 74 28          (osStat(
b400: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62  pFile->zPath, &b
b410: 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74  uf)!=0 || buf.st
b420: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
b430: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
b440: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ;.}.../*.** Chec
b450: 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61  k a unixFile tha
b460: 74 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e  t is a database.
b470: 20 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c    Verify the fol
b480: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31  lowing:.**.** (1
b490: 29 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  ) There is exact
b4a0: 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b  ly one hard link
b4b0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
b4c0: 28 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20  (2) The file is 
b4d0: 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  not a symbolic l
b4e0: 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66  ink.** (3) The f
b4f0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
b500: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
b510: 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65  nked.**.** Issue
b520: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b530: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29  ITE_WARNING,...)
b540: 20 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79   messages if any
b550: 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67  thing is not rig
b560: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ht..*/.static vo
b570: 69 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  id verifyDbFile(
b580: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
b590: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
b5a0: 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  buf;.  int rc;. 
b5b0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
b5c0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
b5d0: 5f 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f  _WARNED ){.    /
b5e0: 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  * One or more of
b5f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
b600: 61 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72  arnings have alr
b610: 65 61 64 79 20 62 65 65 6e 20 69 73 73 75 65 64  eady been issued
b620: 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  .  Do not.    **
b630: 20 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20   repeat them so 
b640: 61 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65  as not to clutte
b650: 72 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20  r the error log 
b660: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
b670: 20 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61   }.  rc = osFsta
b680: 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
b690: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
b6a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b6b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b6c0: 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20  , "cannot fstat 
b6d0: 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69  db file %s", pFi
b6e0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b6f0: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
b700: 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52   |= UNIXFILE_WAR
b710: 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  NED;.    return;
b720: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
b730: 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70  t_nlink==0 && (p
b740: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b750: 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  & UNIXFILE_DELET
b760: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)==0 ){.    sql
b770: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b780: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75  WARNING, "file u
b790: 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70  nlinked while op
b7a0: 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  en: %s", pFile->
b7b0: 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c  zPath);.    pFil
b7c0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
b7d0: 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b  UNIXFILE_WARNED;
b7e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b7f0: 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c  .  if( buf.st_nl
b800: 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ink>1 ){.    sql
b810: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b820: 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70  WARNING, "multip
b830: 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65  le links to file
b840: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
b850: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
b860: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
b870: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
b880: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b890: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
b8a0: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
b8b0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b8c0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
b8d0: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
b8e0: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
b8f0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
b900: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
b910: 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  = UNIXFILE_WARNE
b920: 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  D;.    return;. 
b930: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
b940: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
b950: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
b960: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
b970: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
b980: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
b990: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
b9a0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
b9b0: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
b9c0: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
b9d0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
b9e0: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
b9f0: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
ba00: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
ba10: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
ba20: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
ba30: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
ba40: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
ba50: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
ba60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ba70: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
ba80: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
ba90: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
baa0: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
bab0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
bac0: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
bad0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
bae0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
baf0: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
bb00: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
bb10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
bb20: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
bb30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
bb40: 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  le );.  unixEnte
bb50: 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
bb60: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
bb70: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
bb80: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
bb90: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
bba0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
bbb0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
bbc0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
bbd0: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
bbe0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
bbf0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
bc00: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
bc10: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
bc20: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
bc30: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
bc40: 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  it..  */.#ifndef
bc50: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28   __DJGPP__.  if(
bc60: 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70   !reserved && !p
bc70: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
bc80: 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20  rocessLock ){.  
bc90: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
bca0: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
bcb0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
bcc0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
bcd0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
bce0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
bcf0: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
bd00: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
bd10: 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63  CK;.    if( osFc
bd20: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
bd30: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b  GETLK, &lock) ){
bd40: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
bd50: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
bd60: 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20  SERVEDLOCK;.    
bd70: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
bd80: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
bd90: 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e  } else if( lock.
bda0: 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
bdb0: 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  ){.      reserve
bdc0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
bdd0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69  .#endif.  .  uni
bde0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
bdf0: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
be00: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
be10: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
be20: 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
be30: 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
be40: 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
be50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be60: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
be70: 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b  et a system-lock
be80: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69   on the file pFi
be90: 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  le.  The lock is
bea0: 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62   .** described b
beb0: 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  y pLock..**.** I
bec0: 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73 20  f the pFile was 
bed0: 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74  opened read/writ
bee0: 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c  e from unix-excl
bef0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20  , then the only 
bf00: 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74  lock.** ever obt
bf10: 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c  ained is an excl
bf20: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20  usive lock, and 
bf30: 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65  it is obtained e
bf40: 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74  xactly once.** t
bf50: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e  he first time an
bf60: 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70  y lock is attemp
bf70: 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71  ted.  All subseq
bf80: 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b  uent system lock
bf90: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
bfa0: 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e  s become no-ops.
bfb0: 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74    Locking operat
bfc0: 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65  ions still happe
bfd0: 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a  n internally,.**
bfe0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f   in order to coo
bff0: 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20 62  rdinate access b
c000: 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65 20  etween separate 
c010: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
c020: 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ions.** within t
c030: 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74  his process, but
c040: 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20   all of that is 
c050: 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72  handled in memor
c060: 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65  y and the.** ope
c070: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f  rating system do
c080: 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61  es not participa
c090: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
c0a0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73  unction is a pas
c0b0: 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e  s-through to fcn
c0c0: 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70  tl(F_SETLK) if p
c0d0: 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a  File is using.**
c0e0: 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74   any VFS other t
c0f0: 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  han "unix-excl" 
c100: 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f  or if pFile is o
c110: 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65  pened on "unix-e
c120: 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72  xcl".** and is r
c130: 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ead-only..**.** 
c140: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
c150: 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d   if the call com
c160: 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75  pletes successfu
c170: 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20  lly, or -1 if a 
c180: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c  call.** to fcntl
c190: 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69  () fails. In thi
c1a0: 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73  s case, errno is
c1b0: 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65   set appropriate
c1c0: 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e  ly (by fcntl()).
c1d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
c1e0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78  nixFileLock(unix
c1f0: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72  File *pFile, str
c200: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b  uct flock *pLock
c210: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
c220: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
c230: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
c240: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
c250: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
c260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
c270: 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ode!=0 );.  if( 
c280: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
c290: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58  gs & UNIXFILE_EX
c2a0: 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65  CL)!=0 || pInode
c2b0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a  ->bProcessLock).
c2c0: 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63     && ((pFile->c
c2d0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
c2e0: 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a  ILE_RDONLY)==0).
c2f0: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e    ){.    if( pIn
c300: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c310: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
c320: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
c330: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c340: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
c350: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
c360: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c370: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c380: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
c390: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
c3a0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
c3b0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
c3c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
c3d0: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
c3e0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c3f0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
c400: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20  .      if( rc<0 
c410: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c420: 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63     pInode->bProc
c430: 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  essLock = 1;.   
c440: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c450: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
c460: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
c470: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
c480: 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  rc = osFcntl(pFi
c490: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c4a0: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  pLock);.  }.  re
c4b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c4c0: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
c4d0: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
c4e0: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
c4f0: 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
c500: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
c510: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
c520: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
c530: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
c540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
c550: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
c560: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
c570: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
c580: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
c590: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
c5a0: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
c5b0: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
c5c0: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
c5d0: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
c5e0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
c5f0: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
c600: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
c610: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
c620: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
c630: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
c640: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
c650: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
c660: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
c670: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
c680: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
c690: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
c6a0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
c6b0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
c6c0: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
c6d0: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
c6e0: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
c6f0: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
c700: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
c710: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
c720: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
c730: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
c740: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
c750: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
c760: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
c770: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c780: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
c790: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
c7a0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
c7b0: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
c7c0: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
c7d0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
c7e0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
c7f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
c800: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
c810: 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ock){.  /* The f
c820: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
c830: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
c840: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
c850: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
c860: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
c870: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
c880: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
c890: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
c8a0: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
c8b0: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
c8c0: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
c8d0: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
c8e0: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
c8f0: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
c900: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
c910: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
c920: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
c930: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
c940: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
c950: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
c960: 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73  with windows sys
c970: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
c980: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
c990: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
c9a0: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
c9b0: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
c9c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
c9d0: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
c9e0: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
c9f0: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
ca00: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
ca10: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
ca20: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
ca30: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
ca40: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
ca50: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
ca60: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
ca70: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
ca80: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
ca90: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
caa0: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
cab0: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
cac0: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
cad0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
cae0: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
caf0: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
cb00: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  s successful, a 
cb10: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
cb20: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
cb30: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
cb40: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64   read-locked and
cb50: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
cb60: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
cb70: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20  released..  **. 
cb80: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
cb90: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
cba0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
cbb0: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
cbc0: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
cbd0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
cbe0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
cbf0: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
cc00: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
cc10: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
cc20: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
cc30: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
cc40: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
cc50: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
cc60: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
cc70: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
cc80: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
cc90: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
cca0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
ccb0: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
ccc0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
ccd0: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
cce0: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
ccf0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
cd00: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
cd10: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
cd20: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
cd30: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
cd40: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
cd50: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
cd60: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
cd70: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
cd80: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
cd90: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
cda0: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
cdb0: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
cdc0: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
cdd0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
cde0: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
cdf0: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
ce00: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
ce10: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
ce20: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
ce30: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
ce40: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
ce50: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
ce60: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
ce70: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
ce80: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
ce90: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
cea0: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
ceb0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
cec0: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
ced0: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
cee0: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
cef0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
cf00: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
cf10: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
cf20: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20  atabase. .  **. 
cf30: 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61   ** The reason a
cf40: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e   single byte can
cf50: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  not be used inst
cf60: 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72  ead of the 'shar
cf70: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
cf80: 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65  ge' is that some
cf90: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e   versions of win
cfa0: 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70  dows do not supp
cfb0: 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20  ort read-locks. 
cfc0: 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20  By.  ** locking 
cfd0: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
cfe0: 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63  om a range, conc
cff0: 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f  urrent SHARED lo
d000: 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20  cks may exist.  
d010: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c  ** even if the l
d020: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
d030: 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20   used is always 
d040: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20  a write-lock..  
d050: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
d060: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
d070: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
d080: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
d090: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
d0a0: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
d0b0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
d0c0: 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  tErrno = 0;..  a
d0d0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
d0e0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
d0f0: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
d100: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
d110: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
d120: 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  >h,.      azFile
d130: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
d140: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
d150: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
d160: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
d170: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
d180: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65  FileLock), pFile
d190: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
d1a0: 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
d1b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
d1c0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
d1d0: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
d1e0: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
d1f0: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
d200: 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
d210: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
d220: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
d230: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
d240: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
d250: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
d260: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
d270: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
d280: 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
d290: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
d2a0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
d2b0: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
d2c0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
d2d0: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
d2e0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
d2f0: 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
d300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d310: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
d320: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
d330: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
d340: 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57  ect..  **  (1) W
d350: 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
d360: 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
d370: 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
d380: 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
d390: 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
d3a0: 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
d3b0: 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
d3c0: 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
d3d0: 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
d3e0: 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
d3f0: 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
d400: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d410: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
d420: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d430: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
d440: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d450: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
d460: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
d470: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
d480: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
d490: 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
d4a0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
d4b0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
d4c0: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
d4d0: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
d4e0: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
d4f0: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
d500: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
d510: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
d520: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
d530: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
d540: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
d550: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
d560: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
d570: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
d580: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
d590: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
d5a0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
d5b0: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
d5c0: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
d5d0: 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
d5e0: 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
d5f0: 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
d600: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d610: 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
d620: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
d630: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
d640: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
d650: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
d660: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
d670: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
d680: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
d690: 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
d6a0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
d6b0: 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
d6c0: 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
d6d0: 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
d6e0: 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
d6f0: 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
d700: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
d710: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
d720: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
d730: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d740: 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64  && .      (pInod
d750: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
d760: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
d770: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
d780: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
d790: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
d7a0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d7b0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
d7c0: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
d7d0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
d7e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
d7f0: 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
d800: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d810: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
d820: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
d830: 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
d840: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
d850: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
d860: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44   }...  /* A PEND
d870: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
d880: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
d890: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
d8a0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
d8b0: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
d8c0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
d8d0: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
d8e0: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
d8f0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
d900: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c  leased..  */.  l
d910: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
d920: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d930: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66  = SEEK_SET;.  if
d940: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
d950: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
d960: 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
d970: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
d980: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d990: 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
d9a0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
d9b0: 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63  type = (eFileLoc
d9c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  k==SHARED_LOCK?F
d9d0: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
d9e0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d9f0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
da00: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
da10: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
da20: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
da30: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
da40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
da50: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
da60: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
da70: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
da80: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
da90: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
daa0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
dab0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
dac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
dad0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
dae0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
daf0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
db00: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
db10: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
db20: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
db30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
db40: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
db50: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
db60: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
db70: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
db80: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
db90: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
dba0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
dbb0: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
dbc0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
dbd0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
dbe0: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
dbf0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
dc00: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
dc10: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc20: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
dc30: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
dc40: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
dc50: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
dc60: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
dc70: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
dc80: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
dc90: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
dca0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
dcb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
dcc0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
dcd0: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
dce0: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
dcf0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
dd00: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
dd10: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
dd20: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
dd30: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
dd40: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
dd50: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
dd60: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
dd70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dd80: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
dd90: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
dda0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
ddb0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
ddc0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
ddd0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
dde0: 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20  NLOCK; .    }.. 
ddf0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
de00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
de10: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
de20: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
de30: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
de40: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
de50: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65  end_lock;.    }e
de60: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
de70: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
de80: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
de90: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
dea0: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
deb0: 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
dec0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
ded0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
dee0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
def0: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
df00: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
df10: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
df20: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
df30: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
df40: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
df50: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
df60: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
df70: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
df80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
df90: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
dfa0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
dfb0: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
dfc0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
dfd0: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
dfe0: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
dff0: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
e000: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
e010: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
e020: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
e030: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
e040: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
e050: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63  eLock );.    loc
e060: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
e070: 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  CK;..    assert(
e080: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
e090: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  RVED_LOCK || eFi
e0a0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
e0b0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  E_LOCK );.    if
e0c0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
e0d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
e0e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e0f0: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
e100: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e110: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c  en = 1L;.    }el
e120: 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  se{.      lock.l
e130: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
e140: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
e150: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
e160: 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _SIZE;.    }..  
e170: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e180: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e190: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
e1a0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e1b0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e1c0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e1d0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e1e0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
e1f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e200: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
e210: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e220: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
e230: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
e240: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
e250: 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70  EBUG.  /* Set up
e260: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e270: 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20  -counter change 
e280: 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77  checking flags w
e290: 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74  hen.  ** transit
e2a0: 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48  ioning from a SH
e2b0: 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56  ARED to a RESERV
e2c0: 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68  ED lock.  The ch
e2d0: 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53  ange.  ** from S
e2e0: 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
e2f0: 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69  D marks the begi
e300: 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61  nning of a norma
e310: 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65  l.  ** write ope
e320: 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f  ration (not a ho
e330: 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t journal rollba
e340: 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ck)..  */.  if( 
e350: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
e360: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
e370: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
e380: 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63  K.   && eFileLoc
e390: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
e3a0: 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  .  ){.    pFile-
e3b0: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
e3c0: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   0;.    pFile->d
e3d0: 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
e3e0: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
e3f0: 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23  Write = 1;.  }.#
e400: 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63  endif...  if( rc
e410: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e420: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
e430: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
e440: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
e450: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
e460: 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
e470: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
e480: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
e490: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e4a0: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
e4b0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
e4c0: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
e4d0: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
e4e0: 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
e4f0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
e500: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
e510: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
e520: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
e530: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
e540: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
e550: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
e560: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
e570: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e580: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
e590: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
e5a0: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
e5b0: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
e5c0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
e5d0: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
e5e0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
e5f0: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
e600: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
e610: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
e620: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e630: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
e640: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
e650: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
e660: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
e670: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
e680: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
e690: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
e6a0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
e6b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
e6c0: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
e6d0: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
e6e0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
e6f0: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
e700: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
e710: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
e720: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
e730: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
e740: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
e750: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e760: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
e770: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
e780: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
e790: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
e7a0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
e7b0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
e7c0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
e7d0: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
e7e0: 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
e7f0: 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
e800: 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
e810: 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
e820: 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
e830: 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
e840: 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
e850: 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
e860: 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
e870: 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
e880: 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
e890: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
e8a0: 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
e8b0: 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
e8c0: 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
e8d0: 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
e8e0: 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
e8f0: 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
e900: 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
e910: 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
e920: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
e930: 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f  ic int posixUnlo
e940: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
e950: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
e960: 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46  ck, int handleNF
e970: 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78  SUnlock){.  unix
e980: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
e990: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
e9a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
e9b0: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
e9c0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
e9d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e9e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
e9f0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
ea00: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
ea10: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
ea20: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
ea30: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
ea40: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
ea50: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
ea60: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
ea70: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
ea80: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
ea90: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
eaa0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
eab0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
eac0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ead0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
eae0: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
eaf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
eb00: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
eb10: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
eb20: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
eb30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
eb40: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
eb50: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
eb60: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
eb70: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
eb80: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
eb90: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
eba0: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64  ileLock );..#ifd
ebb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ebc0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
ebd0: 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
ebe0: 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
ebf0: 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
ec00: 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
ec10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ec20: 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
ec30: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
ec40: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
ec50: 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
ec60: 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
ec70: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
ec80: 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
ec90: 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
eca0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
ecb0: 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
ecc0: 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
ecd0: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
ece0: 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
ecf0: 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
ed00: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
ed10: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
ed20: 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
ed30: 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
ed40: 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
ed50: 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
ed60: 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
ed70: 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
ed80: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
ed90: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   */.    pFile->i
eda0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
edb0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
edc0: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20   downgrading to 
edd0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
ede0: 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c   NFS involves cl
edf0: 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65  earing the write
ee00: 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66   lock.    ** bef
ee10: 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67  ore establishing
ee20: 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20   the readlock - 
ee30: 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20  to avoid a race 
ee40: 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77  condition we dow
ee50: 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68  ngrade.    ** th
ee60: 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63  e lock in 2 bloc
ee70: 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74  ks, so that part
ee80: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69   of the range wi
ee90: 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79  ll be covered by
eea0: 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65   a .    ** write
eeb0: 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20   lock until the 
eec0: 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20  rest is covered 
eed0: 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a  by a read lock:.
eee0: 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57      **  1:   [WW
eef0: 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20  WWW].    **  2: 
ef00: 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a    [....W].    **
ef10: 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20    3:   [RRRRW]. 
ef20: 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52     **  4:   [RRR
ef30: 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  R.].    */.    i
ef40: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
ef50: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69  ARED_LOCK ){..#i
ef60: 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
ef70: 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
ef80: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
ef90: 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
efa0: 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
efb0: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
efc0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
efd0: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
efe0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
eff0: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
f000: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
f010: 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
f020: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
f030: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
f040: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
f050: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
f060: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
f070: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
f080: 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
f090: 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
f0a0: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
f0b0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f0c0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f0d0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f0e0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f0f0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f100: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f110: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f120: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
f130: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f140: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f150: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
f160: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
f170: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f180: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f190: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
f1a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
f1b0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
f1c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f1d0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f1e0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f1f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f200: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f210: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f220: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f230: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
f240: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f250: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f260: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f270: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
f280: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f290: 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
f2a0: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
f2b0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f2c0: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
f2d0: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
f2e0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f2f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
f300: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
f310: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
f320: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
f330: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
f340: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
f350: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f360: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f370: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
f380: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f390: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f3a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f3b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f3c0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
f3d0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f3e0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f3f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f400: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
f410: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
f420: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
f430: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
f440: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f450: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f460: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f480: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f490: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f4a0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f4b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
f4c0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
f4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f4e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f4f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
f500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f510: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f530: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
f540: 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
f550: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
f560: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
f570: 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
f580: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f590: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
f5a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f5b0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f5c0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f5d0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f5e0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f5f0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f600: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
f610: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f620: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
f630: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
f640: 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
f650: 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
f660: 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
f670: 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
f680: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
f690: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
f6a0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
f6b0: 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
f6c0: 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
f6d0: 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
f6e0: 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
f6f0: 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
f700: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
f710: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
f720: 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
f730: 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
f740: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
f750: 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
f760: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
f770: 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
f780: 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
f790: 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
f7a0: 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
f7b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
f7c0: 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
f7d0: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
f7e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f7f0: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
f800: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f810: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f820: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f830: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f840: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f850: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f860: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
f870: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f880: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
f890: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
f8a0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
f8b0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
f8c0: 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
f8d0: 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
f8e0: 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
f8f0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f900: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
f910: 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
f920: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
f930: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
f940: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
f950: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f960: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
f970: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
f980: 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  no;.      goto e
f990: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d  nd_unlock;.    }
f9a0: 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65  .  }.  if( eFile
f9b0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
f9c0: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
f9d0: 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
f9e0: 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
f9f0: 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
fa00: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
fa10: 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
fa20: 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
fa30: 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
fa40: 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
fa50: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
fa60: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
fa70: 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
fa80: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
fa90: 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
faa0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
fab0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _UNLCK;.      lo
fac0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
fad0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
fae0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
faf0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
fb00: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
fb10: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
fb20: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
fb30: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
fb40: 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
fb50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fb60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
fb70: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
fb80: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
fb90: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
fba0: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
fbb0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
fbc0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
fbd0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
fbe0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
fbf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
fc00: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
fc10: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
fc20: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
fc30: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
fc40: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
fc50: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
fc60: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
fc70: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
fc80: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
fc90: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
fca0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
fcb0: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
fcc0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
fcd0: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
fce0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
fcf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
fd00: 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
fd10: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
fd20: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
fd30: 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f   }.  }..end_unlo
fd40: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
fd50: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
fd60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
fd70: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
fd80: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
fd90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fda0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
fdb0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
fdc0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
fdd0: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
fde0: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
fdf0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
fe00: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
fe10: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
fe20: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fe30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
fe40: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
fe50: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
fe60: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
fe70: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
fe80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
fe90: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
fea0: 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
feb0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fec0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
fed0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
fee0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
fef0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
ff00: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
ff10: 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
ff20: 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
ff30: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
ff40: 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
ff50: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
ff60: 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
ff70: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
ff80: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
ff90: 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
ffa0: 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
ffb0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  );.static void u
ffc0: 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
ffd0: 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e  xFile *pFd);.#en
ffe0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
fff0: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
10000 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74  s the parts of t
10010 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20  he "close file" 
10020 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f  operation .** co
10030 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
10040 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20  ing schemes. It 
10050 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63  closes the direc
10060 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a  tory and file.**
10070 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65   handles, if the
10080 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64  y are valid, and
10090 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73   sets all fields
100a0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
100b0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
100c0 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   0..**.** It is 
100d0 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20  *not* necessary 
100e0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
100f0 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  x when this rout
10100 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ine is called,.*
10110 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b  * even on VxWork
10120 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c  s.  A mutex will
10130 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20   be acquired on 
10140 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a  VxWorks by the.*
10150 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  * vxworksRelease
10160 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65  FileId() routine
10170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10180 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71  closeUnixFile(sq
10190 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
101a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
101b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
101c0 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  id;.#if SQLITE_M
101d0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
101e0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
101f0 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
10200 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
10210 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  ){.    robust_cl
10220 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
10230 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
10240 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
10250 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58  1;.  }.#if OS_VX
10260 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c  WORKS.  if( pFil
10270 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66  e->pId ){.    if
10280 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
10290 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
102a0 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73  LETE ){.      os
102b0 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  Unlink(pFile->pI
102c0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
102d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
102e0 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
102f0 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
10300 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
10310 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10320 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
10330 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
10340 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
10350 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
10360 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
10370 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  >pUnused);.  mem
10380 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
10390 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
103a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
103b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
103c0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
103d0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
103e0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
103f0 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
10400 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
10410 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10420 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
10430 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  .  verifyDbFile(
10440 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e  pFile);.  unixUn
10450 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
10460 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
10470 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69  tex();..  /* uni
10480 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20  xFile.pInode is 
10490 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72  always valid her
104a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  e. Otherwise, a 
104b0 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a  different close.
104c0 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e    ** routine (e.
104d0 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29  g. nolockClose()
104e0 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65  ) would be calle
104f0 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
10500 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10510 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30  >pInode->nLock>0
10520 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   || pFile->pInod
10530 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
10540 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =0 );.  if( ALWA
10550 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  YS(pFile->pInode
10560 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ) && pFile->pIno
10570 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
10580 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
10590 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
105a0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
105b0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
105c0 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
105d0 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
105e0 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
105f0 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
10600 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
10610 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
10620 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
10630 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
10640 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
10650 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
10660 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
10670 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
10680 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
10690 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
106a0 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
106b0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
106c0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
106d0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
106e0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
106f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10700 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
10710 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
10720 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
10730 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
10740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
107a0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
10810 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
10820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10840 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
10850 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
10860 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
10870 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
10880 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
10890 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
108a0 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
108b0 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
108c0 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
108d0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
108e0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
108f0 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
10900 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
10910 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
10920 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
10930 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
10940 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
10950 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
10960 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
10970 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
10980 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
10990 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
109a0 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
109b0 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
109c0 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
109d0 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
109e0 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
109f0 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
10a00 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
10a10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10a20 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
10a30 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
10a40 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
10a50 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
10a60 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
10a70 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
10a80 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
10a90 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
10aa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
10ab0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
10ac0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
10ad0 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
10ae0 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
10af0 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
10b00 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
10b10 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
10b20 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
10b30 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
10b40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10b50 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
10b60 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
10b70 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
10b80 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
10b90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10ba0 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
10bb0 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
10bc0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10bd0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
10be0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
10bf0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
10c00 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
10c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c20 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
10c30 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
10c40 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10c50 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
10c60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10c70 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10c80 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
10c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10ca0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
10cb0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
10cc0 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
10cd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
10ce0 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   {.  return clos
10cf0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
10d00 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10d10 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
10d20 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
10d30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
10d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d50 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
10e10 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
10e20 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
10e50 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
10e60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
10e70 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
10e80 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
10e90 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
10ea0 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
10eb0 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
10ec0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
10ed0 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
10ee0 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
10ef0 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
10f00 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
10f10 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
10f20 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
10f30 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
10f40 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
10f50 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
10f60 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
10f70 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
10f80 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
10f90 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
10fa0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
10fb0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
10fc0 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
10fd0 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
10fe0 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
10ff0 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
11000 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
11010 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
11020 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
11030 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
11040 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
11050 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
11060 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
11070 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
11080 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
11090 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
110a0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
110b0 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
110c0 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
110d0 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
110e0 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
110f0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
11100 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11110 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
11120 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
11130 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
11140 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
11150 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61  e existence of a
11160 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
11170 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
11180 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
11190 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
111a0 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
111b0 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
111c0 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
111d0 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
111e0 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
111f0 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
11200 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
11210 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
11220 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
11230 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
11240 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
11250 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
11260 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11270 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
11280 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
11290 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
112a0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
112b0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
112c0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
112d0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
112e0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
112f0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
11300 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
11310 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
11320 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
11330 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
11340 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
11350 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
11360 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
11370 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
11380 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
11390 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
113a0 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
113b0 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
113c0 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
113d0 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
113e0 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
113f0 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
11400 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
11410 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
11420 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
11430 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
11440 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
11450 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
11460 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
11470 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11480 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11490 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
114a0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
114b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
114c0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
114d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
114e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
114f0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
11500 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
11510 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
11520 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
11530 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
11540 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
11550 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
11560 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
11570 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
11580 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
11590 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
115a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  LOCK ){.    /* E
115b0 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65  ither this conne
115c0 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74  ction or some ot
115d0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
115e0 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
115f0 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  ss.    ** holds 
11600 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
11610 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  le.  No need to 
11620 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a  check further. *
11630 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  /.    reserved =
11640 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
11650 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20   /* The lock is 
11660 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79  held if and only
11670 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65   if the lockfile
11680 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
11690 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  onst char *zLock
116a0 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
116b0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
116c0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72  ngContext;.    r
116d0 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65  eserved = osAcce
116e0 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
116f0 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
11700 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11710 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
11720 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11730 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
11740 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11750 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11760 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11770 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
11780 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
11790 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
117a0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
117b0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
117c0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
117d0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
117e0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
117f0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11800 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11810 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11820 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11830 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11840 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11850 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11860 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11870 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
11880 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
11890 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
118a0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
118b0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
118c0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
118d0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
118e0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
118f0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11900 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11910 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11920 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11930 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11940 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11950 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11960 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11970 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
11980 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
11990 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
119a0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
119b0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
119c0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
119d0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
119e0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
119f0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11a00 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11a10 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11a20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11a30 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11a40 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11a50 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11a60 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11a70 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11a80 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
11a90 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
11aa0 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
11ab0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
11ac0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
11ad0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
11ae0 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
11af0 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11b00 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11b10 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11b20 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11b30 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11b40 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
11b50 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11b60 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
11b70 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
11b80 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
11b90 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
11ba0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11bb0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
11bc0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
11bd0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
11be0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
11bf0 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
11c00 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
11c10 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
11c20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
11c30 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
11c40 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11c50 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
11c60 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11c70 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
11c80 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
11c90 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
11ca0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
11cb0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
11cc0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
11cd0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
11ce0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
11cf0 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
11d00 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
11d10 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11d30 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11d40 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11d50 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
11d60 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
11d70 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
11d80 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
11d90 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
11da0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
11db0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
11dc0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
11dd0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
11de0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
11df0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11e00 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11e10 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11e20 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11e30 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11e40 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
11e50 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11e60 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
11e70 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11e80 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11e90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
11ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
11eb0 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
11ec0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
11ed0 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
11ee0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11ef0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
11f00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11f10 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
11f20 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
11f30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
11f40 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
11f50 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
11f60 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
11f70 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
11f80 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
11f90 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11fa0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
11fb0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
11fc0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
11fd0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
11fe0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
11ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12000 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
12010 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
12020 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
12030 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
12040 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
12050 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
12060 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
12070 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12080 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
12090 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
120a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
120b0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
120c0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
120d0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
120e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
120f0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12100 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
12110 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
12120 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b   pid=%d (dotlock
12130 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12140 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
12150 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
12160 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
12170 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
12180 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
12190 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
121a0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
121b0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
121c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
121d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
121e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
121f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77    }..  /* To dow
12200 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64  ngrade to shared
12210 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  , simply update 
12220 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74  our internal not
12230 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
12240 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20  lock state.  No 
12250 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74  need to mess wit
12260 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  h the file on di
12270 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  sk..  */.  if( e
12280 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12290 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
122a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
122b0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
122c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
122d0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
122e0 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
122f0 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
12300 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
12310 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  e */.  assert( e
12320 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
12330 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d  K );.  rc = osRm
12340 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  dir(zLockFile);.
12350 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 65 72    if( rc<0 && er
12360 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 20 72  rno==ENOTDIR ) r
12370 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f  c = osUnlink(zLo
12380 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  ckFile);.  if( r
12390 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  c<0 ){.    int t
123a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
123b0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69     rc = 0;.    i
123c0 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72  f( ENOENT != tEr
123d0 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
123e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
123f0 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  NLOCK;.    }.   
12400 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
12410 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
12420 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12430 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
12440 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
12450 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
12460 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12470 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
12480 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12490 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
124a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
124b0 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
124c0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
124d0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
124e0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
124f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
12500 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
12510 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
12520 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
12530 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12540 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f  File*)id;.    do
12550 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
12560 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71  NO_LOCK);.    sq
12570 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
12580 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12590 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
125a0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
125b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
125c0 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
125d0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
125e0 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
125f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
12600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12610 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
126d0 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
126e0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12700 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
12710 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
12720 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
12730 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
12740 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
12750 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
12760 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
12770 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
12780 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
12790 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
127a0 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
127b0 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
127c0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
127d0 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
127e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
127f0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
12800 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
12810 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
12820 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
12830 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
12840 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
12850 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
12860 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
12870 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
12880 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
12890 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
128a0 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
128b0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
128c0 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
128d0 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
128e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
128f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
12900 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69   turned off or i
12910 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66  f.** compiling f
12920 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23  or VXWORKS..*/.#
12930 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
12940 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
12950 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  & !OS_VXWORKS../
12960 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
12970 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
12980 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
12990 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
129a0 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
129b0 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
129c0 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
129d0 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
129e0 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
129f0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
12a00 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
12a10 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
12a20 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
12a30 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
12a40 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
12a50 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
12a60 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
12a70 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
12a80 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
12a90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
12aa0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
12ab0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
12ac0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
12ad0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
12ae0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
12af0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
12b00 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
12b10 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
12b20 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
12b30 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
12b40 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
12b50 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
12b60 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
12b70 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
12b80 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12b90 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
12ba0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12bb0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
12bc0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
12bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12be0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
12bf0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12c00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12c10 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
12c20 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
12c30 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12c40 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
12c50 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
12c60 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
12c70 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
12c80 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
12c90 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
12ca0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
12cb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
12cc0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
12cd0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12ce0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
12cf0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
12d00 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
12d10 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
12d20 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
12d30 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
12d40 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
12d50 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
12d60 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12d70 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
12d80 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
12d90 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
12da0 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
12db0 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
12dc0 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
12dd0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12de0 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
12df0 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
12e00 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
12e10 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
12e20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
12e30 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
12e40 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d  */.        lrc =
12e50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12e60 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 69  LOCK; .        i
12e70 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
12e80 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
12e90 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12ea0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
12eb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
12ec0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12ed0 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
12ee0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
12ef0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12f00 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12f10 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
12f20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
12f30 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
12f40 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
12f50 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12f60 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
12f70 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
12f80 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
12f90 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
12fa0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
12fb0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
12fc0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
12fd0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
12fe0 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
12ff0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
13000 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
13010 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
13020 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
13030 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13040 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
13050 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
13060 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
13070 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
13080 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
13090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
130a0 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65  served=1;.  }.#e
130b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
130c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
130d0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52  _ERRORS */.  *pR
130e0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
130f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13100 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
13110 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
13120 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
13130 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
13140 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
13150 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
13160 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
13170 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
13180 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
13190 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
131a0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
131b0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
131c0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
131d0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
131e0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
131f0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
13200 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
13210 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
13220 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
13230 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
13240 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
13250 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
13260 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
13270 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
13280 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
13290 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
132a0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
132b0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
132c0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
132d0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
132e0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
132f0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
13300 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
13310 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
13320 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
13330 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13340 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
13350 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
13360 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13370 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
13380 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13390 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
133a0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
133b0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
133c0 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
133d0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
133e0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
133f0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
13400 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
13410 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
13420 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
13430 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
13440 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
13450 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
13460 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
13470 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
13480 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
13490 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
134a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
134b0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
134c0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
134d0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
134e0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
134f0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
13500 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
13510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
13520 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
13530 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
13540 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
13550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13560 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13570 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13580 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
13590 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
135a0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
135b0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
135c0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
135d0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
135e0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
135f0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
13600 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
13610 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
13620 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13630 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13640 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
13650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13660 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
13670 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
13680 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f    .  if (robust_
13690 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
136a0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
136b0 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
136c0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
136d0 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
136e0 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
136f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13700 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
13710 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
13720 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
13730 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13740 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
13750 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13760 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13770 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
13780 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
13790 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
137a0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
137b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
137c0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
137d0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
137e0 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
137f0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
13800 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
13810 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
13820 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
13830 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
13840 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
13850 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
13860 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13870 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
13880 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
13890 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
138a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
138b0 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
138c0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
138d0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
138e0 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
138f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
13900 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
13910 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
13920 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
13930 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
13940 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
13950 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
13960 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
13970 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
13980 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
13990 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
139a0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
139b0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
139c0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
139d0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
139e0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
139f0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
13a00 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
13a10 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13a20 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13a30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13a40 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13a50 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
13a60 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
13a70 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
13a80 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
13a90 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
13aa0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
13ab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13ac0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
13ad0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
13ae0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
13af0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13b00 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
13b10 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
13b20 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13b30 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
13b40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13b50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
13b60 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
13b70 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
13b80 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
13b90 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
13ba0 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
13bb0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
13bc0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13bd0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13be0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
13bf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13c00 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
13c10 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
13c20 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
13c30 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
13c40 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
13c50 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13c60 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
13c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13c80 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
13c90 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13ca0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13cb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13cc0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
13cd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
13ce0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
13cf0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
13d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13d10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
13d20 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
13d30 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
13d40 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13d50 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
13d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13d70 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
13d80 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13d90 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  OCK);.    rc = c
13da0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
13db0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13dc0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
13dd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
13de0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
13df0 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
13e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e10 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
13e20 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
13e30 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
13e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
13ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f00 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
13f10 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
13f20 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13f40 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
13f50 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
13f60 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
13f70 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
13f80 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
13f90 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
13fa0 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
13fb0 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
13fc0 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
13fd0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
13fe0 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
13ff0 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
14000 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
14010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14020 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
14030 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
14040 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
14050 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
14060 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
14070 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
14080 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
14090 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
140a0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
140b0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
140c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
140d0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
140e0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
140f0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
14100 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
14110 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
14120 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
14130 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
14140 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
14150 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
14160 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
14170 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
14180 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
14190 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
141a0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
141b0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
141c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
141d0 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
141e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
141f0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
14200 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
14210 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14220 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
14230 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14240 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14250 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
14260 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
14270 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
14280 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
14290 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
142a0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
142b0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
142c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
142d0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
142e0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
142f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
14300 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
14310 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
14320 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
14330 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
14340 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
14350 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
14360 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
14370 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
14380 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
14390 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  em;.    struct s
143a0 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20  tat statBuf;..  
143b0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
143c0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
143d0 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
143e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
143f0 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
14400 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
14410 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14420 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14430 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14440 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14450 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  LOCK);.        p
14460 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14470 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
14480 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
14490 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
144a0 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
144b0 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
144c0 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
144d0 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
144e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
144f0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
14500 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
14510 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
14520 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
14530 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
14540 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
14550 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
14560 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
14570 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
14580 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
14590 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
145a0 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
145b0 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
145c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
145d0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
145e0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
145f0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
14600 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
14610 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
14620 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
14630 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
14640 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
14650 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
14660 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
14670 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
14680 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
14690 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
146a0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
146b0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
146c0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
146d0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
146e0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
146f0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
14700 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
14710 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
14720 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
14730 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14740 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14750 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14760 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14770 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14780 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14790 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
147a0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
147b0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
147c0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
147d0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
147e0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
147f0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
14800 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
14810 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14820 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14830 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14840 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14850 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14860 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14870 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14880 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
14890 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
148a0 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
148b0 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
148c0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
148d0 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
148e0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
148f0 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
14900 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
14910 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
14920 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
14930 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
14940 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
14950 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
14960 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
14970 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14980 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
14990 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
149a0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
149b0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
149c0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
149d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
149e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
149f0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14a00 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14a10 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14a20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14a30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
14a40 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53   fd;.  sem_t *pS
14a50 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
14a60 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  de->pSem;.  int 
14a70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14a80 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
14a90 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
14aa0 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
14ab0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
14ac0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
14ad0 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
14ae0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
14af0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
14b00 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
14b10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14b20 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
14b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14b40 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
14b50 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
14b60 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72  /* lock semaphor
14b70 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f  e now but bail o
14b80 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20  ut when already 
14b90 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28  locked. */.  if(
14ba0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
14bb0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63  m)==-1 ){.    rc
14bc0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
14bd0 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
14be0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
14bf0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
14c00 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
14c10 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
14c20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14c30 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64  eLock;.. sem_end
14c40 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20  _lock:.  return 
14c50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
14c60 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
14c70 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
14c80 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
14c90 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
14ca0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
14cb0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
14cc0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
14cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
14ce0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
14cf0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
14d00 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
14d10 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
14d20 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
14d30 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
14d40 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
14d50 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
14d60 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   semUnlock(sqlit
14d70 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14d80 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
14d90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14da0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14db0 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
14dc0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
14dd0 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pSem;..  assert(
14de0 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
14df0 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53  rt( pSem );.  OS
14e00 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
14e10 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
14e20 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46  =%d (sem)\n", pF
14e30 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
14e40 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
14e50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
14e60 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
14e70 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
14e80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
14e90 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
14ea0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
14eb0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
14ec0 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
14ed0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14ee0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
14ef0 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
14f00 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
14f10 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
14f20 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
14f30 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
14f40 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
14f50 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
14f60 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
14f70 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
14f80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14f90 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
14fa0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
14fb0 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d   ( sem_post(pSem
14fc0 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  )==-1 ) {.    in
14fd0 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
14fe0 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73  rrno;.    rc = s
14ff0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
15000 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15010 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
15020 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
15030 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
15040 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
15050 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
15060 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
15070 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
15080 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15090 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
150a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
150b0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
150c0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
150d0 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65  tic int semClose
150e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
150f0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
15100 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
15110 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15120 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c  *)id;.    semUnl
15130 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
15140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
15150 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
15160 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
15170 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
15180 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e  o(pFile);.    un
15190 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
151a0 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
151b0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
151c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
151d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
151e0 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
151f0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
15200 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
15210 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
15220 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
15230 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
15240 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
15250 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
15260 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
15270 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
152d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15330 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
15340 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
15350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
15370 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
15380 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
15390 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
153a0 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
153b0 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
153c0 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
153d0 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
153e0 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
153f0 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
15400 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
15410 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
15420 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
15430 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
15440 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
15450 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
15460 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
15470 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15480 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
15490 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
154a0 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
154b0 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
154c0 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
154d0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
154e0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
154f0 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
15500 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
15510 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15520 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65   {.  int reserve
15530 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
15540 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
15550 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15560 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
15570 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
15580 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
15590 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
155a0 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
155b0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
155c0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
155d0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
155e0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
155f0 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
15600 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
15610 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
15620 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
15630 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
15640 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
15650 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
15660 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
15670 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
15680 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
15690 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
156a0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
156b0 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
156c0 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
156d0 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
156e0 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
156f0 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
15720 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
15730 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
15740 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
15750 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
15760 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
15770 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
15780 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15790 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
157a0 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
157b0 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
157c0 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
157d0 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
157e0 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
157f0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
15800 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
15810 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
15820 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
15830 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
15840 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
15850 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
15860 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
15870 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
15880 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
15890 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
158a0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
158b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
158c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
158d0 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
158e0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
158f0 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
15900 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
15910 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
15920 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
15930 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
15940 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
15950 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
15960 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
15970 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
15980 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
15990 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
159a0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
159b0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
159c0 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
159d0 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
159e0 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
159f0 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
15a00 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
15a10 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
15a20 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
15a30 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
15a40 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
15a50 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  ;.  .  OSTRACE((
15a60 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
15a70 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
15a80 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
15a90 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
15aa0 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
15ab0 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
15ac0 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
15ad0 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
15ae0 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20  et, length));.  
15af0 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
15b00 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
15b10 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
15b20 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
15b30 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15b40 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
15b50 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15b60 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
15b70 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
15b80 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
15b90 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
15ba0 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
15bb0 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
15bc0 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  )));.#ifdef SQLI
15bd0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15be0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63  CK_ERRORS.    rc
15bf0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
15c00 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
15c10 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
15c20 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c40 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67       setLockFlag
15c50 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
15c60 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  LOCK : SQLITE_IO
15c70 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e  ERR_UNLOCK);.#en
15c80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
15c90 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
15ca0 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20  RORS */.    if( 
15cb0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
15cc0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
15cd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
15ce0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
15cf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
15d00 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
15d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15d20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15d30 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15d40 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15d50 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15d60 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15d70 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15d80 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15d90 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15da0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
15db0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
15dc0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
15dd0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
15de0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
15df0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
15e00 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15e10 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15e20 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15e30 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15e40 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15e50 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
15e60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
15e70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15e80 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
15e90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15ea0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
15eb0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
15ec0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15ed0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15ee0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
15ef0 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a  xt *context;.  .
15f00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15f10 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
15f20 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
15f30 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
15f40 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15f50 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  );.  context = (
15f60 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
15f70 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
15f80 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
15f90 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
15fa0 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
15fb0 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
15fc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15fd0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
15fe0 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
15ff0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
16000 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
16010 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20   threads */.  . 
16020 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
16030 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
16040 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
16050 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
16060 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
16070 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
16080 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
16090 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
160a0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
160b0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
160c0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
160d0 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28   it..   */.  if(
160e0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
160f0 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45    /* lock the RE
16100 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20  SERVED byte */. 
16110 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70     int lrc = afp
16120 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16130 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16140 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
16150 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53  ,1);  .    if( S
16160 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b  QLITE_OK==lrc ){
16170 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
16180 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
16190 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
161a0 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
161b0 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
161c0 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
161d0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
161e0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
161f0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16200 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
16210 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
16220 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
16230 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
16240 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
16250 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
16260 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
16270 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72  t */.      reser
16280 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
16290 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
162a0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
162b0 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d     rc=lrc;.    }
162c0 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
162d0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
162e0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
162f0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61  LOCK %d %d %d (a
16300 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
16310 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
16320 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20  ;.  .  *pResOut 
16330 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
16340 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16350 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
16360 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
16370 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
16380 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
16390 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
163a0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
163b0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
163c0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
163d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
163e0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
163f0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
16400 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
16410 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
16420 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
16430 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
16440 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
16450 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
16460 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
16470 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
16480 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
16490 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
164a0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
164b0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
164c0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
164d0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
164e0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
164f0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
16500 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
16510 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
16520 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
16530 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
16540 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
16550 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
16560 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
16570 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
16580 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
16590 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
165a0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
165b0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
165c0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
165d0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
165e0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
165f0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
16600 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16610 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
16620 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
16630 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
16640 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
16650 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
16660 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
16670 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f  static int afpLo
16680 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16690 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
166a0 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
166b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
166c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
166d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
166e0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
166f0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
16700 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
16710 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
16720 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
16730 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
16740 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
16750 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
16760 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
16770 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
16780 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
16790 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
167a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
167b0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
167c0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
167d0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
167e0 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
167f0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
16800 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
16810 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
16820 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29  hared , getpid()
16830 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
16840 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
16850 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
16860 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
16870 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
16880 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
16890 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
168a0 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f  e the afp_end_lo
168b0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
168c0 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
168d0 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
168e0 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
168f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
16900 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
16910 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
16920 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
16930 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
16940 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22  y held) (afp)\n"
16950 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
16960 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
16970 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
16980 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16990 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
169a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
169b0 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
169c0 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20  s correct.  **  
169d0 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
169e0 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
169f0 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
16a00 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
16a10 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
16a20 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
16a30 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
16a40 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
16a50 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
16a60 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
16a70 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
16a80 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
16a90 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
16aa0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
16ab0 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
16ac0 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
16ad0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16ae0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
16af0 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
16b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16b10 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
16b20 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
16b30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16b40 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
16b50 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
16b60 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
16b70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
16b80 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
16b90 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
16ba0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
16bb0 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
16bc0 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
16bd0 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
16be0 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
16bf0 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
16c00 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
16c10 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
16c20 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
16c30 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
16c40 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
16c50 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
16c60 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
16c70 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
16c80 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65   .       (pInode
16c90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
16ca0 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
16cb0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
16cc0 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
16cd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16ce0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
16cf0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
16d00 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
16d10 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
16d20 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
16d30 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
16d40 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
16d50 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
16d60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
16d70 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
16d80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
16d90 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
16da0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
16db0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
16dc0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
16dd0 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65  .     (pInode->e
16de0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16df0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
16e00 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
16e10 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
16e20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
16e30 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16e40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16e50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16e60 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16e70 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
16e80 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
16e90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
16ea0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
16eb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
16ec0 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
16ed0 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
16ee0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16ef0 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
16f00 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
16f10 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
16f20 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
16f30 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
16f40 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
16f50 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16f60 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
16f70 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
16f80 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
16f90 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
16fa0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
16fb0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
16fc0 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
16fd0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
16fe0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
16ff0 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
17000 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
17010 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
17020 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17030 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17040 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
17050 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20  _BYTE, 1, 1);.  
17060 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a    if (failed) {.
17070 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
17080 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  d;.      goto af
17090 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
170a0 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
170b0 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
170c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
170d0 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
170e0 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
170f0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
17100 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
17110 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
17120 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
17130 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
17140 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
17150 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
17160 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e  rno = 0;.    lon
17170 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20  g lk, mask;.    
17180 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
17190 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
171a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
171b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
171c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a  ==0 );.        .
171d0 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65      mask = (size
171e0 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c  of(long)==8) ? L
171f0 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30  ARGEST_INT64 : 0
17200 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f  x7fffffff;.    /
17210 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
17220 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c  ad-lock SHARED_L
17230 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f  OCK */.    /* no
17240 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c  te that the qual
17250 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f  ity of the rando
17260 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61  mness doesn't ma
17270 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a  tter that much *
17280 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f  /.    lk = rando
17290 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65  m(); .    pInode
172a0 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
172b0 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52  lk & mask)%(SHAR
172c0 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
172d0 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c    lrc1 = afpSetL
172e0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
172f0 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
17300 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17310 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
17320 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
17330 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
17340 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
17350 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
17360 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
17380 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
17390 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
173a0 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
173b0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
173c0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
173d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
173e0 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
173f0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17400 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
17410 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17420 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20   = lrc1Errno;.  
17430 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
17440 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17450 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
17460 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
17470 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
17480 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
17490 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
174a0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
174b0 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
174c0 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
174d0 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
174e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
174f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17500 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
17510 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
17520 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
17530 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
17540 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
17550 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17560 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
17570 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
17580 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
17590 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
175a0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
175b0 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
175c0 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
175d0 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
175e0 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
175f0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
17600 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
17610 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
17620 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
17630 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
17640 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
17650 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
17660 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
17670 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
17680 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
17690 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
176a0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
176b0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
176c0 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
176d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
176e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
176f0 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
17700 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
17710 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
17720 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
17730 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
17740 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
17750 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
17760 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
17770 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
17780 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17790 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
177a0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
177b0 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
177c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
177d0 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
177e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
177f0 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
17800 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
17810 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
17820 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
17830 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
17840 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
17850 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
17860 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17870 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
17880 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
17890 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
178a0 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
178b0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
178c0 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
178d0 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
178e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
178f0 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
17900 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17910 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17920 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
17950 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
17960 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
17970 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
17980 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
17990 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
179a0 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
179b0 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
179c0 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
179d0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
179e0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
179f0 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17a00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
17a30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
17a40 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
17a50 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
17a60 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17a70 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17a90 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
17aa0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17ab0 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
17ac0 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
17ad0 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
17ae0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
17af0 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
17b00 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
17b10 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
17b20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
17b30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17b40 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
17b50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
17b60 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
17b70 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
17b80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17b90 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
17ba0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
17bb0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17bc0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
17bd0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
17be0 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
17bf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17c00 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17c10 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
17c20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
17c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17c40 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
17c50 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17c60 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
17c70 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
17c80 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
17c90 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
17ca0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
17cb0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17cc0 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
17cd0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
17ce0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
17cf0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
17d00 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
17d10 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17d20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
17d30 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
17d40 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17d50 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
17d60 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
17d70 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
17d80 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
17d90 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
17da0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
17db0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
17dc0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
17dd0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
17de0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
17df0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
17e00 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17e10 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17e20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
17e30 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
17e40 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17e50 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
17e60 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
17e70 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
17e80 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
17e90 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
17ea0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
17eb0 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
17ec0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17ed0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
17ee0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17ef0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
17f00 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17f10 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
17f20 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
17f30 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
17f40 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
17f50 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
17f60 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
17f70 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
17f80 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
17f90 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
17fa0 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
17fb0 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
17fc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
17fd0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
17fe0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
17ff0 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
18000 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
18010 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
18020 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
18030 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
18040 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
18050 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
18060 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
18070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74  ,.           get
18080 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
18090 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
180a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
180b0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
180c0 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
180d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
180e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
180f0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
18100 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
18110 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
18120 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
18130 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
18140 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18150 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
18160 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
18170 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
18180 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18190 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65   );.    Simulate
181a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
181b0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
181c0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
181d0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
181e0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
181f0 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
18200 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  _DEBUG.    /* Wh
18210 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
18220 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
18230 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
18240 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
18250 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
18260 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
18270 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
18280 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
18290 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
182a0 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
182b0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
182c0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
182d0 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
182e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
182f0 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
18300 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
18310 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
18320 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
18330 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
18340 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
18350 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
18360 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
18370 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
18380 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
18390 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
183a0 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
183b0 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
183c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
183d0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
183e0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
183f0 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
18400 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
18410 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a  le->dbUpdate==0.
18420 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
18430 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
18440 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69  ng==1 );.    pFi
18450 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
18460 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
18470 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65    .    if( pFile
18480 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ->eFileLock==EXC
18490 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
184a0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
184b0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
184c0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
184d0 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45  RED_FIRST, SHARE
184e0 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
184f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18500 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
18510 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
18520 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
18530 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  d>1) ){.        
18540 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62  /* only re-estab
18550 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
18560 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72  lock if necessar
18570 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
18580 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
18590 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
185a0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
185b0 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e;.        rc = 
185c0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
185d0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
185e0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
185f0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
18600 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
18610 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b   skipShared = 1;
18620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18640 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
18650 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
18660 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  G_LOCK ){.      
18670 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18680 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18690 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
186a0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
186b0 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   } .    if( rc==
186c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
186d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52  le->eFileLock>=R
186e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
186f0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
18700 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
18710 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18720 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18730 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
18740 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
18750 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
18760 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
18770 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
18780 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
187a0 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
187b0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
187c0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29  ode->nShared>1))
187d0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
187e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
187f0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
18800 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
18810 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c  ITE_OK && eFileL
18820 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock==NO_LOCK ){.
18830 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
18840 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
18850 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
18860 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
18870 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
18880 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
18890 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
188a0 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
188b0 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
188c0 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
188d0 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e     */.    unsign
188e0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
188f0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
18900 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
18910 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
18920 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
18930 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
18940 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
18950 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61   ){.      Simula
18960 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18970 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
18980 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
18990 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
189a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
189b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73  0);.      if( !s
189c0 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20  kipShared ){.   
189d0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
189e0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
189f0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
18a00 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
18a10 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
18a20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
18a30 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
18a40 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
18a50 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
18a60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
18a70 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
18a80 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18aa0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
18ab0 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  --;.      assert
18ac0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
18ad0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
18ae0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
18af0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
18b00 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
18b10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
18b20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
18b30 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
18b40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18b50 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
18b60 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
18b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18b80 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
18b90 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
18ba0 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
18bb0 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
18bc0 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
18bd0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
18be0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
18bf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
18c00 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
18c10 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
18c20 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
18c30 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
18c40 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
18c50 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
18c60 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
18c70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
18c80 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
18c90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
18ca0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
18cb0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
18cc0 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
18cd0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
18ce0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
18cf0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
18d00 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
18d10 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
18d20 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
18d30 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
18d40 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e  Inode->aPending.
18d50 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
18d60 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
18d70 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
18d80 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
18d90 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
18da0 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
18db0 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
18dc0 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
18dd0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
18de0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18df0 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
18e00 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
18e10 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
18e20 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
18e30 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
18e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18e50 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
18e60 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
18e70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18e80 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
18e90 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
18ea0 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
18eb0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
18ec0 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
18ed0 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
18ee0 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
18ef0 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
18f00 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
18f10 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
18f20 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
18f30 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
18f40 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
18f50 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
18f60 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
18f70 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
18f80 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
18f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
18fa0 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
18fb0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
18fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fd0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19020 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19090 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
190a0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
190b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190c0 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
190d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
190e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
190f0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
19100 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
19110 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
19120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
19130 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
19140 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
19150 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
19160 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
19170 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
19180 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
19190 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
191a0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
191b0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
191c0 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
191d0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
191e0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
191f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
19200 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
19210 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
19220 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
19230 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
19240 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
19250 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a   eFileLock, 1);.
19260 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
19270 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
19280 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
19290 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
192a0 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
192b0 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
192c0 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
192d0 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
192e0 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
192f0 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
19300 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
19310 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
19320 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
19330 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
19340 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
19350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19360 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
19370 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
19380 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
19390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
193a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
19450 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
19460 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
19470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
19490 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
194a0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
194b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
194c0 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
194d0 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
194e0 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
194f0 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
19500 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
19510 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
19520 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
19530 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
19540 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
19550 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
19560 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
19570 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
19580 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
19590 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
195a0 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
195b0 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
195c0 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
195d0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
195e0 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
195f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19600 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
19610 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
19620 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
19630 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
19640 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
19650 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
19660 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
19670 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
19680 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
19690 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
196a0 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
196b0 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
196c0 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
196d0 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
196e0 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
196f0 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
19700 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
19710 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
19720 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62  * any any form b
19730 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
19740 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
19750 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
19760 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
19770 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
19780 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
19790 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
197a0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
197b0 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
197c0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
197d0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
197e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
197f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19800 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
19810 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
19820 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
19830 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
19840 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
19850 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
19860 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
19870 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
19880 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
19890 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
198a0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
198b0 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
198c0 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
198d0 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
198e0 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
198f0 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66    cnt &= 0x1ffff
19900 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
19910 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19920 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
19930 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19940 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19950 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19960 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19970 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19980 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
19990 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
199a0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
199b0 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
199c0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
199d0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
199e0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
199f0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
19a00 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
19a10 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19a20 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
19a30 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
19a40 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
19a50 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
19a60 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
19a70 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19a80 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19a90 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
19aa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
19ab0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
19ac0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  stErrno = 0;.   
19ad0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
19ae0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
19af0 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
19b00 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
19b10 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
19b20 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
19b30 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
19b40 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
19b50 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
19b60 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
19b70 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
19b80 3b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  ;.      ((unixFi
19b90 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
19ba0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
19bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
19bc0 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a  se if( got>0 ){.
19bd0 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74        cnt -= got
19be0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
19bf0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69  = got;.      pri
19c00 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  or += got;.     
19c10 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28   pBuf = (void*)(
19c20 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75  got + (char*)pBu
19c30 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  f);.    }.  }whi
19c40 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54  le( got>0 );.  T
19c50 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
19c60 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
19c70 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
19c80 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  u\n",.          
19c90 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69    id->h, got+pri
19ca0 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72  or, offset-prior
19cb0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
19cc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b  );.  return got+
19cd0 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  prior;.}../*.** 
19ce0 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
19cf0 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
19d00 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
19d10 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
19d20 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
19d30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
19d40 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
19d50 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
19d60 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
19d70 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
19d80 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
19d90 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
19da0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
19db0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
19dc0 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
19dd0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19de0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
19df0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
19e00 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
19e10 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
19e20 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
19e30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
19e40 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
19e50 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
19e60 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
19e70 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
19e80 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
19e90 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
19ea0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
19eb0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
19ec0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
19ed0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
19ee0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
19ef0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
19f00 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
19f10 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
19f20 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
19f30 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
19f40 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
19f50 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
19f60 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
19f70 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
19f80 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
19f90 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
19fa0 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
19fb0 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
19fc0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
19fd0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
19fe0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
19ff0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1a000 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1a010 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1a020 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
1a030 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1a040 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1a050 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
1a060 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a070 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1a080 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1a090 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1a0a0 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1a0b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1a0c0 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1a0d0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1a0e0 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
1a0f0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1a100 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1a110 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1a120 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1a130 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1a140 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a150 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1a160 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1a170 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1a180 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1a190 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a1a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1a1b0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1a1c0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1a1d0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1a1e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1a1f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1a200 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a210 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1a220 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
1a230 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1a240 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
1a250 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1a260 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
1a270 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
1a280 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
1a290 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
1a2a0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1a2b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1a2c0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
1a2d0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1a2e0 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65  seek the file-de
1a2f0 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20  scriptor passed 
1a300 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1a310 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f  ument to.** abso
1a320 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66  lute offset iOff
1a330 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
1a340 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74  o write nBuf byt
1a350 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a  es of data from.
1a360 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49  ** pBuf to it. I
1a370 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a380 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64  s, return -1 and
1a390 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f   set *piErrno. O
1a3a0 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65  therwise, .** re
1a3b0 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20  turn the actual 
1a3c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a3d0 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d  written (which m
1a3e0 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a  ay be less than.
1a3f0 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61  ** nBuf)..*/.sta
1a400 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a410 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64  riteFd(.  int fd
1a420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a440 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1a450 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1a460 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20  4 iOff,         
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a480 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20   File offset to 
1a490 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
1a4a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1a4b0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1a4c0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61        /* Copy da
1a4d0 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1a4e0 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fer to the file 
1a4f0 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20  */.  int nBuf,  
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a520 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62  buffer pBuf in b
1a530 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
1a540 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20  iErrno          
1a550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a560 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69  : Error number i
1a570 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  f error occurs *
1a580 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1a590 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a5a0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1a5b0 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74  returned by syst
1a5c0 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73  em call */..  as
1a5d0 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75  sert( nBuf==(nBu
1a5e0 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  f&0x1ffff) );.  
1a5f0 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a  assert( fd>2 );.
1a600 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66    nBuf &= 0x1fff
1a610 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  f;.  TIMER_START
1a620 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  ;..#if defined(U
1a630 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20  SE_PREAD).  do{ 
1a640 72 63 20 3d 20 6f 73 50 77 72 69 74 65 28 66 64  rc = osPwrite(fd
1a650 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1a660 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  ff); }while( rc<
1a670 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1a680 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  R );.#elif defin
1a690 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
1a6a0 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72    do{ rc = osPwr
1a6b0 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20  ite64(fd, pBuf, 
1a6c0 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69  nBuf, iOff);}whi
1a6d0 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1a6e0 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
1a6f0 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1a700 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c  Seek = lseek(fd,
1a710 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29   iOff, SEEK_SET)
1a720 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1a730 45 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29  Error( iSeek-- )
1a740 3b 0a 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b  ;..    if( iSeek
1a750 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  !=iOff ){.      
1a760 69 66 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70  if( piErrno ) *p
1a770 69 45 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d  iErrno = (iSeek=
1a780 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29  =-1 ? errno : 0)
1a790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
1a7a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
1a7b0 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42  = osWrite(fd, pB
1a7c0 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68  uf, nBuf);.  }wh
1a7d0 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1a7e0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
1a7f0 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44  dif..  TIMER_END
1a800 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ;.  OSTRACE(("WR
1a810 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
1a820 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64  7lld %llu\n", fd
1a830 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45  , rc, iOff, TIME
1a840 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20  R_ELAPSED));..  
1a850 69 66 28 20 72 63 3c 30 20 26 26 20 70 69 45 72  if( rc<0 && piEr
1a860 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  rno ) *piErrno =
1a870 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e   errno;.  return
1a880 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1a890 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1a8a0 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
1a8b0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
1a8c0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
1a8d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1a8e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1a8f0 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
1a900 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
1a910 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1a920 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1a930 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1a940 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61  led write the la
1a950 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1a960 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1a970 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1a980 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a990 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
1a9a0 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63  d, i64 offset, c
1a9b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1a9c0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74   int cnt){.  ret
1a9d0 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65  urn seekAndWrite
1a9e0 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  Fd(id->h, offset
1a9f0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64  , pBuf, cnt, &id
1aa00 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a  ->lastErrno);.}.
1aa10 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1aa20 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1aa30 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
1aa40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1aa50 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
1aa60 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1aa70 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
1aa80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1aa90 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
1aaa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1aab0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1aac0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1aad0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1aae0 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
1aaf0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1ab00 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1ab10 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
1ab20 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1ab30 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1ab40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1ab50 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1ab60 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1ab70 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1ab80 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1ab90 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1aba0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1abb0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1abc0 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1abd0 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1abe0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1abf0 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
1ac00 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1ac10 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1ac20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1ac30 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1ac40 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1ac50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1ac60 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
1ac70 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1ac80 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1ac90 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1aca0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
1acb0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1acc0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1acd0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1ace0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1acf0 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
1ad00 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
1ad10 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
1ad20 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1ad30 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
1ad40 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
1ad50 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1ad60 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
1ad70 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
1ad80 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
1ad90 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1ada0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
1adb0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
1adc0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
1add0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
1ade0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
1adf0 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
1ae00 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
1ae10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1ae20 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
1ae30 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
1ae40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ae50 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1ae60 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1ae70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
1ae80 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
1ae90 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1aea0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
1aeb0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
1aec0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
1aed0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
1aee0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
1aef0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1af00 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
1af10 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1af20 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
1af30 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
1af40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1af50 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1af60 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1af70 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
1af80 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77  s much of this w
1af90 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20  rite request as 
1afa0 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1afb0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1afc0 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1afd0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1afe0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1aff0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1b000 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1b010 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1b020 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1b030 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1b040 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1b050 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1b060 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1b070 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1b080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b0a0 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1b0b0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1b0c0 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1b0d0 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
1b0e0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1b0f0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43  ffset], pBuf, nC
1b100 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1b110 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1b120 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1b130 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1b140 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1b150 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1b160 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
1b170 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
1b180 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
1b190 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
1b1a0 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
1b1b0 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1b1c0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1b1d0 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1b1e0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1b1f0 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1b200 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1b210 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1b220 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1b230 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1b240 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1b250 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  ;..  if( amt>0 )
1b260 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
1b270 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
1b280 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
1b290 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
1b2a0 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1b2b0 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
1b2c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b2d0 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1b2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1b2f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1b300 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
1b310 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1b320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b330 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1b340 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b350 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1b360 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1b370 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1b380 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1b390 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1b3a0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1b3b0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1b3c0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1b3d0 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1b3e0 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1b3f0 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1b400 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1b410 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1b420 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1b430 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1b440 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1b450 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1b460 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1b470 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1b480 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1b490 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1b4a0 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1b4b0 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1b4c0 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1b4d0 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1b4e0 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1b4f0 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1b500 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1b510 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1b520 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1b530 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1b540 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23  c=fdatasync.*/.#
1b550 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
1b560 61 73 79 6e 63 29 0a 23 20 64 65 66 69 6e 65 20  async).# define 
1b570 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1b580 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1b590 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1b5a0 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1b5b0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1b5c0 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1b5d0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1b5e0 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1b5f0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1b600 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1b610 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1b620 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1b630 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1b640 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1b650 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1b660 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1b670 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1b680 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1b690 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1b6a0 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1b6b0 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1b6c0 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1b6d0 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1b6e0 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1b6f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1b700 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1b710 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1b720 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1b730 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1b740 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1b750 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1b760 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1b770 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1b780 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1b790 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1b7a0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1b7b0 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1b7c0 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1b7d0 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1b7e0 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1b7f0 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1b800 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1b810 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1b820 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1b830 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1b840 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1b850 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1b860 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1b870 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1b880 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1b890 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1b8a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1b8b0 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1b8c0 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1b8d0 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1b8e0 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1b8f0 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1b900 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1b910 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1b920 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1b930 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1b940 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1b950 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1b960 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1b970 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1b980 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1b990 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1b9a0 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1b9b0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1b9c0 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1b9d0 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1b9e0 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1b9f0 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1ba00 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1ba10 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1ba20 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1ba30 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1ba40 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1ba50 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1ba60 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1ba70 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1ba80 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1ba90 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1baa0 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1bab0 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1bac0 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1bad0 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1bae0 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1baf0 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1bb00 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1bb10 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1bb20 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1bb30 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1bb40 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1bb50 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1bb60 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1bb70 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1bb80 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1bb90 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1bba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1bbb0 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1bbc0 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1bbd0 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1bbe0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1bbf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1bc00 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1bc10 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1bc20 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1bc30 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1bc40 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1bc50 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1bc60 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1bc70 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1bc80 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1bc90 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1bca0 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1bcb0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1bcc0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1bcd0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1bce0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bcf0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1bd00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1bd10 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1bd20 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1bd30 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1bd40 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1bd50 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1bd60 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1bd70 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1bd80 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1bd90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1bda0 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1bdb0 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1bdc0 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1bdd0 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1bde0 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1bdf0 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1be00 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1be10 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1be20 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1be30 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1be40 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1be50 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1be60 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1be70 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1be80 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1be90 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1bea0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1beb0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1bec0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1bed0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1bee0 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1bef0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1bf00 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
1bf10 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1bf20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bf30 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1bf40 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
1bf50 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
1bf60 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46   osFcntl(fd, F_F
1bf70 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20  ULLFSYNC, 0);.  
1bf80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1bf90 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74  1;.  }.  /* If t
1bfa0 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69  he FULLFSYNC fai
1bfb0 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  led, fall back t
1bfc0 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20  o attempting an 
1bfd0 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74  fsync()..  ** It
1bfe0 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f   shouldn't be po
1bff0 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66  ssible for fullf
1c000 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20  sync to fail on 
1c010 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20  the local .  ** 
1c020 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20  file system (on 
1c030 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65  OSX), so failure
1c040 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1c050 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69  FULLFSYNC.  ** i
1c060 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66  sn't supported f
1c070 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73  or this file sys
1c080 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74  tem. So, attempt
1c090 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20   an fsync .  ** 
1c0a0 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67  and (for now) ig
1c0b0 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61  nore the overhea
1c0c0 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f  d of a superfluo
1c0d0 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20  us fcntl call.  
1c0e0 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65  .  ** It'd be be
1c0f0 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66  tter to detect f
1c100 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74  ullfsync support
1c110 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20   once and avoid 
1c120 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20  .  ** the fcntl 
1c130 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20  call every time 
1c140 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a  sync is called..
1c150 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20    */.  if( rc ) 
1c160 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c170 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
1c180 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66  _APPLE__).  /* f
1c190 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46  datasync() on HF
1c1a0 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66  S+ doesn't yet f
1c1b0 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69  lush the file si
1c1c0 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64  ze if it changed
1c1d0 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1c1e0 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20  so currently we 
1c1f0 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d  default to the m
1c200 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69  acro that redefi
1c210 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f  nes fdatasync to
1c220 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63   fsync.  */.  rc
1c230 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65   = fsync(fd);.#e
1c240 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74  lse .  rc = fdat
1c250 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f  async(fd);.#if O
1c260 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
1c270 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d  rc==-1 && errno=
1c280 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20  =ENOTSUP ){.    
1c290 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c2a0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53    }.#endif /* OS
1c2b0 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64  _VXWORKS */.#end
1c2c0 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
1c2d0 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20  TE_NO_SYNC elif 
1c2e0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
1c2f0 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f  /..  if( OS_VXWO
1c300 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29  RKS && rc!= -1 )
1c310 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
1c320 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c330 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
1c340 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1c350 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
1c360 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20  containing file 
1c370 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66  zFilename..** If
1c380 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46   successful, *pF
1c390 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
1c3a0 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63  opened file desc
1c3b0 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51  riptor and.** SQ
1c3c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1c3d0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
1c3e0 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20   occurs, either 
1c3f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
1c400 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or SQLITE_CANTOP
1c410 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EN is returned a
1c420 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  nd *pFd is set t
1c430 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a  o an undefined.*
1c440 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  * value..**.** T
1c450 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
1c460 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1c470 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e  used for only on
1c480 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20  e thing - to.** 
1c490 66 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74  fsync() a direct
1c4a0 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ory to make sure
1c4b0 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61   file creation a
1c4c0 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e  nd deletion even
1c4d0 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65  ts.** are flushe
1c4e0 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68  d to disk.  Such
1c4f0 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20   fsyncs are not 
1c500 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a  needed on newer.
1c510 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69  ** journaling fi
1c520 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61  lesystems, but a
1c530 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f  re required on o
1c540 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73  lder filesystems
1c550 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c560 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72  tine can be over
1c570 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65  ridden using the
1c580 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74   xSetSysCall int
1c590 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61  erface..** The a
1c5a0 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69  bility to overri
1c5b0 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  de this routine 
1c5c0 77 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70  was added in sup
1c5d0 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63  port of the.** c
1c5e0 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e  hromium sandbox.
1c5f0 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65    Opening a dire
1c600 63 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72  ctory is a secur
1c610 69 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65  ity risk (we are
1c620 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b  .** told) so mak
1c630 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61  ing it overridea
1c640 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ble allows the c
1c650 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20  hromium sandbox 
1c660 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68  to.** replace th
1c670 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
1c680 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
1c690 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20  .  To make this 
1c6a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d  routine.** a no-
1c6b0 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77  op, replace it w
1c6c0 69 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20  ith a stub that 
1c6d0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1c6e0 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20  K but leaves.** 
1c6f0 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65  *pFd set to a ne
1c700 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a  gative number..*
1c710 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1c720 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1c730 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1c740 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f  ponsible for clo
1c750 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65  sing.** the file
1c760 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64   descriptor *pFd
1c770 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a   using close()..
1c780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
1c790 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
1c7a0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1c7b0 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20  e, int *pFd){.  
1c7c0 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64  int ii;.  int fd
1c7d0 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44   = -1;.  char zD
1c7e0 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  irname[MAX_PATHN
1c7f0 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74  AME+1];..  sqlit
1c800 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1c810 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61  PATHNAME, zDirna
1c820 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  me, "%s", zFilen
1c830 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28  ame);.  for(ii=(
1c840 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e  int)strlen(zDirn
1c850 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44  ame); ii>1 && zD
1c860 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b  irname[ii]!='/';
1c870 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69   ii--);.  if( ii
1c880 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61  >0 ){.    zDirna
1c890 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  me[ii] = '\0';. 
1c8a0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
1c8b0 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1c8c0 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1c8d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
1c8e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  =0 ){.      OSTR
1c8f0 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE(("OPENDIR %-
1c900 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1c910 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  irname));.    }.
1c920 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1c930 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
1c940 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c  ?SQLITE_OK:unixL
1c950 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1c960 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1c970 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29  pen", zDirname))
1c980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1c990 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1c9a0 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1c9b0 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1c9c0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1c9d0 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1c9e0 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1c9f0 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1ca00 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1ca10 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1ca20 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1ca30 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1ca40 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1ca50 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1ca60 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1ca70 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1ca80 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1ca90 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1caa0 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1cab0 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1cac0 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1cad0 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1cae0 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1caf0 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1cb00 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1cb10 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1cb20 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1cb30 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1cb40 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1cb50 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1cb60 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1cb70 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1cb80 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1cb90 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1cba0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1cbb0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1cbc0 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1cbd0 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1cbe0 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1cbf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1cc00 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1cc10 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1cc20 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1cc30 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1cc40 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1cc50 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1cc60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1cc70 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1cc80 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1cc90 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1cca0 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1ccb0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1ccc0 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1ccd0 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1cce0 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1ccf0 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1cd00 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1cd10 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1cd20 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1cd30 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1cd40 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1cd50 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1cd60 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1cd70 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1cd80 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1cd90 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1cda0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1cdb0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1cdc0 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1cdd0 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1cde0 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1cdf0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1ce00 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1ce10 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1ce20 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1ce30 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1ce40 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1ce50 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1ce60 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1ce70 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1ce80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1ce90 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1cea0 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1ceb0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1cec0 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1ced0 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1cee0 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1cef0 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1cf00 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1cf10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1cf20 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1cf30 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1cf40 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1cf50 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1cf60 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
1cf70 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1cf80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
1cf90 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
1cfa0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1cfb0 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
1cfc0 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
1cfd0 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
1cfe0 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
1cff0 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20  currence.  Many 
1d000 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
1d010 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
1d020 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
1d030 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
1d040 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
1d050 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
1d060 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
1d070 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1d080 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
1d090 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
1d0a0 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
1d0b0 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
1d0c0 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
1d0d0 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
1d0e0 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
1d0f0 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
1d100 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
1d110 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
1d120 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
1d130 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
1d140 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d150 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66  QLITE_OK && dirf
1d160 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75  d>=0 ){.      fu
1d170 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1d180 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1d190 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1d1a0 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1d1b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1d1c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1d1d0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
1d1e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d1f0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1d200 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1d210 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1d220 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1d240 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1d250 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1d260 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1d270 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1d280 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d290 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1d2a0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d2b0 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1d2c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1d2d0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1d2e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1d2f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d300 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1d310 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1d320 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1d330 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1d340 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1d350 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1d360 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1d370 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1d380 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1d390 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1d3a0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1d3b0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1d3c0 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1d3d0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1d3e0 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1d3f0 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1d400 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1d410 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
1d420 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1d430 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1d440 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1d450 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1d460 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1d470 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1d480 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74  pFile->h, (off_t
1d490 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72  )nByte);.  if( r
1d4a0 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
1d4b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1d4c0 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  o;.    return un
1d4d0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1d4e0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1d4f0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1d500 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1d510 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
1d520 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1d530 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1d540 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1d550 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1d560 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1d570 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
1d580 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1d590 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1d5a0 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1d5b0 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
1d5c0 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1d5d0 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
1d5e0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1d5f0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1d600 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
1d610 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
1d620 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
1d630 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
1d640 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
1d650 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
1d660 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
1d670 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
1d680 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
1d690 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
1d6a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d6b0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1d6c0 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
1d6d0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1d6e0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1d6f0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
1d700 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1d710 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1d720 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1d730 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74  was just truncat
1d740 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
1d750 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
1d760 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d  rrently.    ** m
1d770 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
1d780 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1d790 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
1d7a0 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
1d7b0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20  will.    ** use 
1d7c0 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
1d7d0 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
1d7e0 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
1d7f0 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
1d800 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
1d810 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  ( nByte<pFile->m
1d820 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1d830 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1d840 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
1d850 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
1d860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d870 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
1d880 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
1d890 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
1d8a0 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
1d8b0 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
1d8c0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1d8d0 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
1d8e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1d8f0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1d900 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1d910 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
1d920 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1d930 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
1d940 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1d950 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
1d960 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
1d970 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
1d980 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1d990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d9a0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1d9b0 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1d9c0 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1d9d0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1d9e0 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1d9f0 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1da00 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1da10 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1da20 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1da30 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1da40 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1da50 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1da60 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1da70 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1da80 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1da90 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1daa0 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1dab0 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1dac0 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1dad0 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1dae0 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1daf0 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1db00 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1db10 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1db20 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1db30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1db40 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1db50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1db60 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1db70 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1db80 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1db90 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1dba0 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1dbb0 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1dbc0 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1dbd0 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1dbe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1dbf0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1dc00 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1dc10 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1dc20 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1dc30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1dc40 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1dc50 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1dc60 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1dc70 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1dc80 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
1dc90 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
1dca0 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
1dcb0 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
1dcc0 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
1dcd0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1dce0 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
1dcf0 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
1dd00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1dd10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1dd20 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
1dd30 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
1dd40 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
1dd50 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
1dd60 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1dd70 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
1dda0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
1ddb0 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
1ddc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1ddd0 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
1dde0 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
1ddf0 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
1de00 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
1de10 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72 65 74  ->h, &buf) ) ret
1de20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1de30 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e 53 69  _FSTAT;..    nSi
1de40 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69  ze = ((nByte+pFi
1de50 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f  le->szChunk-1) /
1de60 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29   pFile->szChunk)
1de70 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1de80 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  k;.    if( nSize
1de90 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a  >(i64)buf.st_siz
1dea0 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e ){..#if define
1deb0 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
1dec0 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
1ded0 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
1dee0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
1def0 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c  e below is handl
1df00 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
1df10 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63  alue of osFalloc
1df20 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ate() .      ** 
1df30 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78  correctly. posix
1df40 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20  _fallocate() is 
1df50 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75  defined to "retu
1df60 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  rns zero on succ
1df70 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ess, .      ** o
1df80 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65  r an error numbe
1df90 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20  r on  failure". 
1dfa0 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20  See the manpage 
1dfb0 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1dfc0 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20        int err;. 
1dfd0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1dfe0 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61   err = osFalloca
1dff0 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66  te(pFile->h, buf
1e000 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
1e010 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
1e020 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d      }while( err=
1e030 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
1e040 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e  if( err ) return
1e050 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1e060 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ITE;.#else.     
1e070 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f   /* If the OS do
1e080 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69  es not have posi
1e090 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66  x_fallocate(), f
1e0a0 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20 75 73  ake it. First us
1e0b0 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72 75 6e  e.      ** ftrun
1e0c0 63 61 74 65 28 29 20 74 6f 20 73 65 74 20 74 68  cate() to set th
1e0d0 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74 68 65  e file size, the
1e0e0 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  n write a single
1e0f0 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20 20 2a   byte to.      *
1e100 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  * the last byte 
1e110 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 77 69  in each block wi
1e120 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1e130 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20  d region. This. 
1e140 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73       ** is the s
1e150 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20 75 73  ame technique us
1e160 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f 20 69  ed by glibc to i
1e170 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66  mplement posix_f
1e180 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20 20 20  allocate().     
1e190 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20 74   ** on systems t
1e1a0 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1e1b0 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1e1c0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  () system call..
1e1d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1e1e0 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74  nt nBlk = buf.st
1e1f0 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69  _blksize;  /* Fi
1e200 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20  le-system block 
1e210 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  size */.      i6
1e220 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 iWrite;       
1e230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1e240 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74  t offset to writ
1e250 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69  e to */..      i
1e260 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
1e270 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53  ate(pFile->h, nS
1e280 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ize) ){.        
1e290 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e2a0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1e2b0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1e2c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1e2d0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1e2e0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1e2f0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1e300 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1e310 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20  ((buf.st_size + 
1e320 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b  2*nBlk - 1)/nBlk
1e330 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20  )*nBlk-1;.      
1e340 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e 53  while( iWrite<nS
1e350 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1e360 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b  nt nWrite = seek
1e370 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
1e380 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a  iWrite, "", 1);.
1e390 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69          if( nWri
1e3a0 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  te!=1 ) return S
1e3b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1e3c0 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69 74  E;.        iWrit
1e3d0 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20  e += nBlk;.     
1e3e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1e3f0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1e400 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1e410 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1e420 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
1e430 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
1e440 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
1e450 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
1e460 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
1e470 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1e480 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1e490 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1e4a0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
1e4b0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1e4c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e4d0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1e4e0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1e4f0 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1e500 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1e510 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e520 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
1e530 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
1e540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1e550 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
1e580 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
1e590 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
1e5a0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
1e5b0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
1e5c0 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
1e5d0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1e5e0 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
1e5f0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1e600 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
1e610 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
1e620 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
1e630 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
1e640 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
1e650 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
1e660 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
1e670 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
1e680 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
1e690 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
1e6a0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
1e6b0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
1e6c0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
1e6d0 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
1e6e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
1e6f0 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
1e700 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1e710 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
1e720 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e730 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
1e740 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
1e750 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
1e760 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e770 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
1e780 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1e790 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
1e7a0 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1e7b0 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1e7c0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1e7d0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1e7e0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1e7f0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1e800 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1e810 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e820 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e830 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1e840 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e850 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1e860 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1e870 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1e880 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1e890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e8a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1e8b0 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
1e8c0 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1e8d0 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1e8e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1e8f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e900 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e910 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e920 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1e930 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1e940 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1e950 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1e960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e970 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e980 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1e990 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1e9a0 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1e9b0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e9c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1e9d0 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1e9e0 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1e9f0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1ea00 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1ea10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1ea20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1ea30 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1ea40 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1ea50 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1ea60 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1ea70 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
1ea80 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1ea90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eaa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eab0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1eac0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1ead0 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
1eae0 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1eaf0 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
1eb00 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1eb10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eb20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eb30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1eb40 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1eb50 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1eb60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1eb70 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1eb80 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1eb90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ebb0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1ebc0 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1ebd0 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1ebe0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1ebf0 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  c( pFile->pVfs->
1ec00 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
1ec10 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
1ec20 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65  {.        unixGe
1ec30 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
1ec40 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1ec50 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  e, zTFile);.    
1ec60 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1ec70 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
1ec80 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1ec90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1eca0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ecb0 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
1ecc0 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  D: {.      *(int
1ecd0 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73  *)pArg = fileHas
1ece0 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20  Moved(pFile);.  
1ecf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ed00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20  E_OK;.    }.#if 
1ed10 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1ed20 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
1ed30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
1ed40 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
1ed50 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
1ed60 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
1ed70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ed80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
1ed90 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
1eda0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
1edb0 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
1edc0 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
1edd0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1ede0 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mmap;.      }.  
1edf0 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
1ee00 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1ee10 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
1ee20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
1ee30 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
1ee40 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
1ee50 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
1ee60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1ee70 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1ee80 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
1ee90 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
1eea0 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1eeb0 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61          unixUnma
1eec0 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20  pfile(pFile);.  
1eed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
1eee0 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  xMapfile(pFile, 
1eef0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
1ef00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ef10 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65  urn rc;.    }.#e
1ef20 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1ef30 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1ef40 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20  The pager calls 
1ef50 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73  this method to s
1ef60 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61  ignal that it ha
1ef70 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20  s done.    ** a 
1ef80 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61  rollback and tha
1ef90 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
1efa0 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68  s therefore unch
1efb0 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  anged and.    **
1efc0 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20   it hence it is 
1efd0 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73  OK for the trans
1efe0 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f  action change co
1eff0 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20  unter to be.    
1f000 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ** unchanged..  
1f010 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1f020 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1f030 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20  CHANGED: {.     
1f040 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1f050 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
1f060 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f070 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
1f080 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f090 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1f0a0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1f0b0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
1f0c0 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  ase SQLITE_SET_L
1f0d0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
1f0e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45    case SQLITE_GE
1f0f0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1f100 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1f110 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1f120 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1f130 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1f140 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1f150 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1f160 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1f170 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1f180 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1f190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f1a0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1f1b0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1f1c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1f1d0 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1f1e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1f1f0 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1f200 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1f210 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1f220 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1f230 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1f240 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1f250 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1f260 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1f270 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1f280 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1f290 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1f2a0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1f2b0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1f2c0 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1f2d0 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1f2e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1f2f0 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1f300 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1f310 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1f320 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1f330 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1f340 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1f350 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1f360 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1f370 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1f380 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1f390 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1f3a0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1f3b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1f3c0 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1f3d0 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1f3e0 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1f3f0 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1f400 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1f410 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1f420 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1f430 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1f440 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1f450 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1f460 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1f470 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1f480 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1f490 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1f4a0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1f4b0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1f4c0 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1f4d0 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1f4e0 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1f4f0 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1f500 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1f510 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f520 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1f530 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1f540 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f550 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f560 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1f570 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1f580 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1f590 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1f5a0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f5b0 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1f5c0 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1f5d0 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1f5e0 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1f5f0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f600 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1f610 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1f620 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f630 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1f640 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1f650 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1f660 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1f670 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1f680 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1f690 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1f6a0 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1f6b0 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1f6c0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1f6d0 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f700 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1f710 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1f720 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1f730 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1f740 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1f750 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1f760 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f790 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1f7a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1f7b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1f7c0 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1f7d0 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1f7e0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f7f0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1f800 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1f810 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f820 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f830 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1f840 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1f850 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1f860 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1f870 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1f880 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1f890 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1f8a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f8b0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1f8c0 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1f8d0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1f8e0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1f920 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1f930 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f940 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1f950 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1f960 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1f970 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1f9b0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1f9c0 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1f9d0 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1f9e0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1f9f0 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1fa00 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fa10 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1fa20 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1fa30 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fa40 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1fa50 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1fa60 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1fa70 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1fa80 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1fa90 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1faa0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1fab0 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1fac0 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1fad0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1fae0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1fb10 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1fb20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1fb30 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1fb40 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1fb50 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1fb60 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1fb70 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1fba0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1fbb0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1fbc0 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1fbd0 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1fbe0 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1fbf0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1fc00 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1fc10 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1fc20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1fc30 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1fc40 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1fc50 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1fc60 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1fc70 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1fc80 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1fc90 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fca0 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1fcb0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1fcc0 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1fcd0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fce0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1fcf0 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1fd00 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1fd10 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1fd50 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1fd60 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1fd70 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
1fd80 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
1fd90 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1fda0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1fdb0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1fdc0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1fdd0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fde0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1fdf0 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1fe00 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1fe10 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1fe20 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1fe30 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1fe40 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1fe50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fe60 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1fe70 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1fe80 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1fe90 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1fea0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1feb0 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1fec0 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1fef0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1ff00 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1ff10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1ff20 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1ff30 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1ff40 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1ff50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
1ff60 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
1ff70 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1ff80 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1ff90 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1ffa0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1ffb0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1ffc0 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1fff0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
20000 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
20010 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
20020 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
20030 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
20040 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
20050 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
20060 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
20070 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
20080 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
20090 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
200a0 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
200b0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
200c0 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
200d0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
200e0 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
200f0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
20100 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
20110 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
20120 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
20130 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
20140 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20150 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
20160 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
20170 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
20180 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
20190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
201a0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
201b0 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
201c0 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
201d0 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
201e0 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69  contraversial si
201f0 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
20200 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
20210 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
20220 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
20230 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
20240 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
20250 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
20260 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
20270 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
20280 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
20290 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
202a0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
202b0 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
202c0 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
202d0 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
202e0 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
202f0 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
20300 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
20310 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
20320 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
20330 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
20340 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
20350 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
20360 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
20370 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
20380 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
20390 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
203a0 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
203b0 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
203c0 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
203d0 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
203e0 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
203f0 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
20400 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
20410 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
20420 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
20430 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
20440 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
20450 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
20460 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
20470 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
20480 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
20490 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
204a0 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
204b0 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
204c0 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
204d0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
204e0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
204f0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
20500 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
20510 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
20520 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
20530 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
20540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
20550 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20560 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
20570 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
20580 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
20590 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
205a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
205b0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
205c0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
205d0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
205e0 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
205f0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
20600 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
20610 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
20620 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
20630 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
20640 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
20650 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
20660 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
20670 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
20680 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
20690 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
206a0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
206b0 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
206c0 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
206d0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
206e0 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
206f0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
20700 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
20710 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
20720 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
20730 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
20740 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
20750 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
20760 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
20770 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
20780 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
20790 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
207a0 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
207b0 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
207c0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
207d0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
207e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
207f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20800 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
20810 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20820 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
20830 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
20840 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
20850 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
20860 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
20870 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
20880 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
20890 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
208a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
208b0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
208c0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
208d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
208e0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
208f0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
20900 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
20910 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
20920 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
20930 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
20940 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
20950 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
20960 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
20970 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
20980 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
20990 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
209a0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
209b0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
209c0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
209d0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
209e0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
209f0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
20a00 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
20a10 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
20a20 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
20a30 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
20a40 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
20a50 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
20a60 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
20a70 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
20a80 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
20a90 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
20aa0 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
20ab0 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ad0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
20ae0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
20af0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
20b00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20b10 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
20b20 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
20b30 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
20b40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20b50 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
20b60 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
20b70 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
20b80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
20b90 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
20ba0 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
20bb0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
20bc0 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
20bd0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
20be0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
20c10 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
20c20 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
20c30 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
20c40 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
20c50 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
20c60 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
20c70 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
20c80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20c90 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
20ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20cb0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
20cc0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
20cd0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
20ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20cf0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
20d00 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
20d10 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
20d20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
20d30 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
20d40 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
20d50 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
20d60 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
20d70 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
20d80 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
20d90 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
20da0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
20db0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
20dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
20dd0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
20de0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
20df0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
20e00 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
20e10 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
20e20 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
20e30 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
20e40 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
20e50 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
20e60 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
20e70 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
20e80 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
20e90 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
20ea0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
20eb0 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
20ec0 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
20ed0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
20ee0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
20ef0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
20f00 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
20f10 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
20f20 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
20f30 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
20f40 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
20f50 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
20f60 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
20f70 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
20f80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20f90 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
20fa0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
20fb0 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
20fe0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
20ff0 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
21000 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
21010 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
21020 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
21030 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
21040 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
21050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21060 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
21070 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
21080 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
21090 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
210a0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
210b0 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
210c0 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
210d0 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
210e0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
210f0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
21100 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
21110 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
21120 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
21130 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
21140 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
21150 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
21160 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
21170 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
21180 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
21190 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
211a0 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
211b0 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
211c0 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
211d0 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
211e0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
211f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
21200 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
21210 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
21220 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
21230 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
21240 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
21250 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
21260 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
21270 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
21280 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
21290 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
212a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
212b0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
212c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
212d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
21300 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
21310 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
21320 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
21330 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
21340 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
21350 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
21360 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
21370 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
21380 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
21390 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
213a0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
213b0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
213c0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
213d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
213e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
213f0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
21400 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
21410 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
21420 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
21430 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
21440 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
21450 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
21460 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
21470 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
21480 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
21490 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
214a0 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
214b0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
214c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
214d0 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
214e0 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
214f0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
21500 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
21510 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
21520 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
21530 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
21540 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
21550 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
21560 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
21570 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
21580 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
21590 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
215a0 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
215b0 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
215c0 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
215d0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
215e0 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
215f0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
21600 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
21610 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21620 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
21630 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
21640 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
21650 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f  mask = ofst>31 ?
21660 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 28 31   0xffffffff : (1
21670 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
21680 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
21690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
216a0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
216b0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
216c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
216d0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
216e0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
216f0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
21700 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
21710 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
21720 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
21730 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
21740 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
21750 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
21760 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
21770 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
21780 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
21790 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
217a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
217b0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
217c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
217d0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
217e0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
217f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
21800 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
21810 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
21820 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
21830 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
21840 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
21850 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
21860 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
21870 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
21880 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
21890 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
218a0 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
218b0 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
218c0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
218d0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
218e0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
218f0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
21900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21910 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
21920 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
21930 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
21940 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
21950 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
21960 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
21970 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
21980 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
21990 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
219a0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
219b0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
219c0 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
219d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
219e0 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20       .}.../*.** 
219f0 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
21a00 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
21a10 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
21a20 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
21a30 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
21a40 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
21a50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
21a60 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
21a70 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
21a80 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
21a90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
21aa0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
21ab0 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
21ac0 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
21ad0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
21ae0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
21af0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
21b00 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
21b10 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
21b20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
21b30 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
21b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
21b50 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
21b60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
21b70 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
21b80 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
21b90 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
21ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
21bb0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
21bc0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
21bd0 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
21be0 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
21bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21c00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
21c10 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
21c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
21c30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
21c40 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
21c50 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
21c60 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
21c70 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
21c80 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
21c90 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
21ca0 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
21cb0 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
21cc0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
21cd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
21ce0 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
21cf0 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
21d00 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
21d10 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
21d20 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
21d30 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
21d40 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
21d50 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
21d60 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
21d70 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
21d80 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
21d90 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
21da0 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
21db0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
21dc0 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
21dd0 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
21de0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
21df0 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
21e00 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
21e10 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
21e20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21e30 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
21e40 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
21e50 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
21e60 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
21e70 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
21e80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
21e90 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
21ea0 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
21eb0 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
21ec0 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
21ed0 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
21ee0 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
21ef0 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
21f00 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
21f10 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
21f20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
21f30 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
21f40 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
21f50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21f60 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
21f70 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
21f80 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
21f90 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
21fa0 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
21fb0 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
21fc0 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
21fd0 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
21fe0 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
21ff0 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
22000 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
22010 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
22020 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
22030 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
22040 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
22050 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
22060 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
22070 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
22080 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
22090 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
220a0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
220b0 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
220c0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
220d0 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
220e0 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
220f0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
22100 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
22110 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
22120 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
22130 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
22140 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
22150 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
22160 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
22170 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
22180 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
22190 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
221a0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
221b0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
221c0 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
221d0 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
221e0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
221f0 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
22200 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
22210 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
22220 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
22230 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
22240 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
22250 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
22260 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
22270 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
22280 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
22290 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
222a0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
222b0 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
222c0 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
222d0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
222e0 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
222f0 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
22300 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
22310 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
22320 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
22330 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
22340 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
22350 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
22360 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
22370 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
22380 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
22390 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
223a0 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
223b0 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
223c0 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
223d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
223e0 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
223f0 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
22400 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
22410 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
22420 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
22430 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
22440 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
22450 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
22460 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
22470 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
22480 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
22490 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
224a0 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
224b0 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
224c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
224d0 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
224e0 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
224f0 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
22500 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
22510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22520 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
22530 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
22540 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
22550 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
22560 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
22570 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
22580 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
225b0 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
225c0 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
225d0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
225e0 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
225f0 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
22600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22610 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
22620 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
22630 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
22640 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
22650 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
22660 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
22670 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
22680 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
22690 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
226a0 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
226b0 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
226c0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
226d0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
226e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
226f0 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
22700 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
22710 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
22720 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
22730 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
22740 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
22750 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
22760 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
22770 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
22780 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
22790 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
227a0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
227b0 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
227c0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
227d0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
227e0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
227f0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
22800 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
22810 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
22820 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
22830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
22840 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
22850 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
22860 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
22870 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
22880 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
22890 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
228a0 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
228b0 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
228c0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
228d0 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
228e0 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
228f0 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
22900 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
22910 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  sions..    */.  
22920 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44    if( osFstat(pD
22930 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  bFd->h, &sStat) 
22940 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  && pInode->bProc
22950 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
22960 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22970 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
22980 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
22990 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
229a0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
229b0 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
229c0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
229d0 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
229e0 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23  RECTORY) + 31;.#
229f0 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
22a00 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74  ename = 6 + (int
22a10 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a  )strlen(pDbFd->z
22a20 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
22a30 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
22a40 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
22a50 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
22a60 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b   nShmFilename );
22a70 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
22a80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
22a90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22aa0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
22ab0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
22ac0 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e      memset(pShmN
22ad0 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
22ae0 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69  pShmNode)+nShmFi
22af0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68  lename);.    zSh
22b00 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
22b10 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
22b20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
22b30 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
22b40 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22b50 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
22b60 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
22b70 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
22b80 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
22b90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22ba0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
22bb0 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
22bc0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
22bd0 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
22be0 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
22bf0 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
22c00 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
22c10 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
22c20 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
22c30 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
22c40 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
22c50 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
22c60 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
22c70 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ath, zShmFilenam
22c80 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  e);.#endif.    p
22c90 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b  ShmNode->h = -1;
22ca0 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f  .    pDbFd->pIno
22cb0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de->pShmNode = p
22cc0 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68  ShmNode;.    pSh
22cd0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20  mNode->pInode = 
22ce0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
22cf0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
22d00 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
22d10 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
22d20 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
22d30 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
22d40 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
22d50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22d60 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
22d70 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
22d80 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   }..    if( pIno
22d90 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
22da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
22db0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
22dc0 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
22dd0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
22de0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62  _uri_boolean(pDb
22df0 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64  Fd->zPath, "read
22e00 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b  only_shm", 0) ){
22e10 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
22e20 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
22e30 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
22e40 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
22e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
22e60 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
22e70 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
22e80 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  ename, openFlags
22e90 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
22ea0 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69  &0777));.      i
22eb0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
22ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22ed0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
22ee0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
22ef0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
22f00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
22f10 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
22f20 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _err;.      }.. 
22f30 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
22f40 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
22f50 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65  ng as root, make
22f60 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53   sure that the S
22f70 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  HM file.      **
22f80 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65   is owned by the
22f90 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20   same user that 
22fa0 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61  owns the origina
22fb0 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68  l database.  Oth
22fc0 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
22fd0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77   the original ow
22fe0 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ner will not be 
22ff0 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e  able to connect.
23000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23010 6f 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64  osFchown(pShmNod
23020 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75  e->h, sStat.st_u
23030 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64  id, sStat.st_gid
23040 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43  );.  .      /* C
23050 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
23060 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
23070 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
23080 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
23090 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
230a0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
230b0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
230c0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
230d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
230e0 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
230f0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
23100 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
23110 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
23120 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
23130 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
23140 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
23150 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
23160 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
23170 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
23180 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
23190 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
231a0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
231b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
231c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
231d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
231e0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
231f0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
23200 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
23210 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
23220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23230 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
23240 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
23250 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
23260 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
23270 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
23280 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
23290 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
232a0 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
232b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
232c0 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
232d0 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
232e0 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
232f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
23300 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
23310 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
23320 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
23330 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
23340 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
23350 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
23360 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
23370 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
23380 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
23390 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
233a0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
233b0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
233c0 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
233d0 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
233e0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
233f0 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
23400 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
23410 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
23420 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
23430 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
23440 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
23450 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
23460 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
23470 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
23480 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
23490 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
234a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
234b0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
234c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
234d0 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
234e0 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
234f0 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
23500 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23510 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
23520 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
23530 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
23540 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
23550 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
23560 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
23570 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
23580 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
23590 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
235a0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
235b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
235c0 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
235d0 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
235e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
235f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
23600 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
23610 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
23620 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
23630 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
23640 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
23650 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
23660 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
23670 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
23680 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
23690 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
236a0 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
236b0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
236c0 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
236d0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
236e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
236f0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
23700 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
23710 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
23720 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
23730 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
23740 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
23750 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
23760 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
23770 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
23780 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
23790 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
237a0 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
237b0 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
237c0 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
237d0 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
237e0 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
237f0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
23800 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
23810 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
23820 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
23830 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
23840 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
23850 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
23860 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
23870 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
23880 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
23890 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
238a0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
238b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
238c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
238d0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
238e0 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
238f0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
23900 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
23910 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
23920 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
23930 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
23940 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
23950 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
23960 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
23970 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
23980 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23990 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
239a0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
239b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
239c0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
239d0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
239e0 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
239f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
23a00 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
23a10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
23a20 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
23a30 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
23a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23a50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
23a60 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
23a70 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
23a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23a90 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
23aa0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
23ab0 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
23ac0 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
23ad0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
23ae0 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
23af0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
23b00 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
23b10 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
23b20 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
23b30 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
23b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23b50 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
23b60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
23b70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23b80 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
23b90 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
23ba0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23bb0 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
23bc0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23bd0 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
23be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23bf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23c00 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
23c10 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
23c20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
23c30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23c40 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23c50 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
23c60 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
23c70 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
23c80 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
23c90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23ca0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
23cb0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
23cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23cd0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
23ce0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
23cf0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
23d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23d10 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
23d20 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
23d30 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
23d40 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
23d50 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
23d60 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
23d70 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
23d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
23d90 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
23da0 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
23db0 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
23dc0 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
23dd0 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
23de0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
23df0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
23e00 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
23e10 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
23e20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
23e30 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
23e40 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
23e50 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
23e60 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
23e70 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
23e80 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
23e90 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
23ea0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
23eb0 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
23ec0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
23ed0 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
23ee0 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
23ef0 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
23f00 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
23f10 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
23f20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
23f30 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
23f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
23f50 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
23f60 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
23f70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
23f80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
23f90 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
23fa0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
23fb0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
23fc0 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
23fd0 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
23fe0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
23ff0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
24000 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
24010 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
24020 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
24030 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
24040 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
24050 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
24060 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24070 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ned..        */.
24080 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78          if( !bEx
24090 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tend ){.        
240a0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
240b0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
240c0 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e         /* Altern
240d0 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
240e0 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74  end is true, ext
240f0 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f  end the file. Do
24100 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
24110 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69   ** writing a si
24120 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65  ngle byte to the
24130 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53   end of each (OS
24140 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20  ) page being.   
24150 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
24160 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54  d or extended. T
24170 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e  echnically, we n
24180 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  eed only write t
24190 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
241a0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72   last page in or
241b0 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68  der to extend th
241c0 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74  e file. But writ
241d0 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20  ing to all new. 
241e0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20         ** pages 
241f0 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f  forces the OS to
24200 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69   allocate them i
24210 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63  mmediately, whic
24220 68 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20  h reduces.      
24230 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73    ** the chances
24240 20 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65   of SIGBUS while
24250 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d   accessing the m
24260 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74  apped region lat
24270 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  er on..        *
24280 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a  /.        else{.
24290 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
242a0 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
242b0 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20  = 4096;.        
242c0 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20    int iPg;..    
242d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
242e0 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
242f0 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c  of each newly al
24300 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e  located or exten
24310 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ded page */.    
24320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e        assert( (n
24330 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20  Byte % pgsz)==0 
24340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
24350 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73  (iPg=(sStat.st_s
24360 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28  ize/pgsz); iPg<(
24370 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67  nByte/pgsz); iPg
24380 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
24390 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74   if( seekAndWrit
243a0 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  eFd(pShmNode->h,
243b0 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a   iPg*pgsz + pgsz
243c0 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29 21 3d 31  -1, "", 1, 0)!=1
243d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
243e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
243f0 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ile = pShmNode->
24400 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
24410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
24420 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
24430 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
24440 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29   "write", zFile)
24450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24460 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24480 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24490 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
244a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
244b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
244c0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
244d0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
244e0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
244f0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
24500 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
24510 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
24520 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
24530 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
24540 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
24550 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
24560 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
24570 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
24580 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
24590 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
245a0 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
245b0 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
245c0 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70  New;.    while(p
245d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
245e0 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20  <=iRegion){.    
245f0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
24600 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
24610 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
24620 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28    pMem = osMmap(
24630 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20  0, szRegion,.   
24640 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
24650 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20  e->isReadonly ? 
24660 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54  PROT_READ : PROT
24670 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45  _READ|PROT_WRITE
24680 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  , .            M
24690 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e  AP_SHARED, pShmN
246a0 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e  ode->h, szRegion
246b0 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e  *(i64)pShmNode->
246c0 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20  nRegion.        
246d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
246e0 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
246f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24700 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
24710 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
24720 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d  AP, "mmap", pShm
24730 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
24740 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
24750 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
24760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
24770 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
24780 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  m = sqlite3_mall
24790 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  oc(szRegion);.  
247a0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
247b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
247c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
247d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
247e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
247f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24800 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20  memset(pMem, 0, 
24810 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
24820 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
24830 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
24840 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d  Node->nRegion] =
24850 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68   pMem;.      pSh
24860 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
24870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
24880 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
24890 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
248a0 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
248b0 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
248c0 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
248d0 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
248e0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
248f0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
24900 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
24910 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
24920 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
24930 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
24940 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
24950 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
24960 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24970 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
24980 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
24990 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
249a0 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
249b0 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
249c0 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
249d0 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
249e0 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
249f0 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
24a00 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
24a10 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
24a20 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
24a30 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
24a40 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
24a50 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
24a60 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
24a70 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
24a80 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
24a90 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
24aa0 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
24ab0 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
24ac0 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
24ad0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
24ae0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
24af0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
24b00 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
24b10 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
24b20 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
24b30 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
24b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
24b50 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
24b60 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
24b70 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
24ba0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
24bb0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
24bc0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
24bd0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
24be0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
24bf0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
24c00 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
24c10 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
24c20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
24c30 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
24c40 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
24c50 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
24c60 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
24c70 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
24c80 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
24c90 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
24ca0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24cc0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
24cd0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
24ce0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
24cf0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
24d00 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
24d10 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
24d20 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
24d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
24d60 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
24d90 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
24da0 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
24db0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
24dc0 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
24dd0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
24de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
24df0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
24e00 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
24e10 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
24e20 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
24e30 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
24e40 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
24e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
24e60 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
24e70 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
24e80 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
24e90 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
24ea0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
24eb0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
24ec0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
24ed0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
24ee0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
24ef0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
24f00 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
24f10 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
24f20 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
24f30 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
24f40 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
24f50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
24f60 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
24f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
24f80 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
24f90 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
24fa0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
24fb0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24fc0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
24fd0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
24fe0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
24ff0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
25000 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
25010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
25020 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
25030 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
25040 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
25050 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
25060 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
25070 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
25080 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
25090 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
250a0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
250b0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
250c0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
250d0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
250e0 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
250f0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
25100 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
25110 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
25120 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
25130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25140 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
25150 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
25160 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
25170 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
25180 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
25190 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
251a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
251b0 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
251c0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
251d0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
251e0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
251f0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
25200 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
25210 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
25220 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
25230 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25250 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
25260 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
25270 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
25280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25290 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
252a0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
252b0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
252c0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
252d0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
252e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
252f0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
25300 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
25310 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
25320 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
25330 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
25340 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
25350 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
25360 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
25370 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
25380 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
25390 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
253a0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
253b0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
253c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
253d0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
253e0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
253f0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
25400 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25410 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25420 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25430 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25440 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25450 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
25460 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
25470 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
25490 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
254a0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
254b0 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
254c0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
254d0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
254e0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
254f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25500 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
25510 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
25520 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
25530 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
25540 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
25550 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  e, F_RDLCK, ofst
25560 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
25570 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
25580 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25590 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
255a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
255b0 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
255c0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
255d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
255e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
255f0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
25600 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
25610 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
25620 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
25630 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
25640 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
25650 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
25660 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
25670 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
25680 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
25690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
256a0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
256b0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
256c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
256d0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
256e0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
256f0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
25700 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
25710 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25720 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
25730 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25740 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
25750 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
25760 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
25770 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
25780 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
25790 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
257a0 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
257b0 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
257c0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
257d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
257e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
257f0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
25800 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
25810 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  RLCK, ofst+UNIX_
25820 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
25830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25850 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
25860 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
25870 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
25880 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
25890 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
258a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
258b0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
258c0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
258d0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
258e0 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
258f0 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
25900 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
25910 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
25920 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
25930 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
25940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25950 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
25960 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
25970 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
25980 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
25990 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
259a0 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
259b0 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
259c0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
259d0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
259e0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
259f0 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
25a00 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
25a10 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
25a20 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
25a30 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
25a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25a50 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
25a60 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
25a70 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
25a80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
25a90 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  fd);.  unixEnter
25aa0 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c  Mutex();.  unixL
25ab0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
25ac0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
25ad0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
25ae0 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
25af0 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
25b00 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
25b10 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
25b20 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
25b30 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
25b40 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
25b50 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
25b60 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
25b70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
25b80 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
25b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
25ba0 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  nixShmUnmap(.  s
25bb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25bd0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
25be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25bf0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
25c00 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
25c10 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68      /* Delete sh
25c20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74  ared-memory if t
25c30 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  rue */.){.  unix
25c40 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
25c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25c60 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
25c70 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
25c80 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
25c90 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
25ca0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
25cb0 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
25cc0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
25cd0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
25ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
25cf0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
25d00 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
25d10 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  s */.  unixFile 
25d20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
25d30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
25d40 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
25d50 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62  e file */..  pDb
25d60 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
25d70 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
25d80 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
25d90 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
25da0 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
25db0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
25dc0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
25dd0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
25de0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
25df0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
25e00 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
25e10 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20  d->pInode );..  
25e20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
25e30 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
25e40 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
25e50 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
25e60 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
25e70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
25e80 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
25e90 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
25ea0 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
25eb0 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
25ec0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
25ed0 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
25ee0 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
25ef0 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
25f00 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
25f10 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
25f20 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
25f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
25f40 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
25f50 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
25f60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
25f70 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
25f80 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
25f90 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
25fa0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
25fb0 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
25fc0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
25fd0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
25fe0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
25ff0 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
26000 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
26010 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
26020 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
26030 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20  ShmNode->h>=0 ) 
26040 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
26050 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
26060 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28     unixShmPurge(
26070 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  pDbFd);.  }.  un
26080 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
26090 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
260a0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23  _OK;.}...#else.#
260b0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d   define unixShmM
260c0 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
260d0 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20  e unixShmLock   
260e0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
260f0 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
26100 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d  efine unixShmUnm
26110 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
26120 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
26130 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66  OMIT_WAL */..#if
26140 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
26150 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  _SIZE>0./*.** If
26160 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
26170 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20   memory mapped, 
26180 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a  unmap file pFd..
26190 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
261a0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
261b0 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61  xFile *pFd){.  a
261c0 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
261d0 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66  chOut==0 );.  if
261e0 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
261f0 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61  n ){.    osMunma
26200 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  p(pFd->pMapRegio
26210 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  n, pFd->mmapSize
26220 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64  Actual);.    pFd
26230 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
26240 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
26250 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ize = 0;.    pFd
26260 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
26270 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
26280 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79  ** Return the sy
26290 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a  stem page size..
262a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
262b0 69 78 47 65 74 50 61 67 65 73 69 7a 65 28 76 6f  ixGetPagesize(vo
262c0 69 64 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52  id){.#if HAVE_MR
262d0 45 4d 41 50 0a 20 20 72 65 74 75 72 6e 20 35 31  EMAP.  return 51
262e0 32 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  2;.#elif defined
262f0 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
26300 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
26310 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
26320 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
26330 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
26340 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
26350 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
26360 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
26370 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
26380 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c  aintained by fil
26390 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  e .** descriptor
263a0 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74   pFd to nNew byt
263b0 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67  es. Any existing
263c0 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63   mapping is disc
263d0 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arded..**.** If 
263e0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
263f0 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
26400 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
26410 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
26420 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61      unixFile.pMa
26430 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  pRegion.**      
26440 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
26450 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  ze.**       unix
26460 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74  File.mmapSizeAct
26470 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73  ual.**.** If uns
26480 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72  uccessful, an er
26490 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
264a0 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65  ogged via sqlite
264b0 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74  3_log() and.** t
264c0 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c  he three variabl
264d0 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72  es above are zer
264e0 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  oed. In this cas
264f0 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a  e SQLite should.
26500 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65  ** continue acce
26510 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
26520 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65  se using the xRe
26530 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28  ad() and xWrite(
26540 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  ).** methods..*/
26550 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
26560 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e  xRemapfile(.  un
26570 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20  ixFile *pFd,    
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26590 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
265a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
265b0 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20   nNew           
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265d0 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67  Required mapping
265e0 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   size */.){.  co
265f0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
26600 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68   "mmap";.  int h
26610 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20   = pFd->h;      
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26630 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
26640 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69  or open on db fi
26650 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69  le */.  u8 *pOri
26660 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70  g = (u8 *)pFd->p
26670 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20  MapRegion;   /* 
26680 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
26690 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20  nt file mapping 
266a0 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d  */.  i64 nOrig =
266b0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
266c0 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a  tual;     /* Siz
266d0 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f  e of pOrig regio
266e0 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
266f0 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20  u8 *pNew = 0;   
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26710 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e       /* Location
26720 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20   of new mapping 
26730 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  */.  int flags =
26740 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20   PROT_READ;     
26750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
26760 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d  gs to pass to mm
26770 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ap() */..  asser
26780 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
26790 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
267a0 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70  ( nNew>pFd->mmap
267b0 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
267c0 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61  ( nNew<=pFd->mma
267d0 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73  pSizeMax );.  as
267e0 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
267f0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d    assert( pFd->m
26800 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70  mapSizeActual>=p
26810 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
26820 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41    assert( MAP_FA
26830 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66  ILED!=0 );..  if
26840 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
26850 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
26860 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20  NLY)==0 ) flags 
26870 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a  |= PROT_WRITE;..
26880 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 20    if( pOrig ){. 
26890 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
268a0 79 73 70 61 67 65 20 3d 20 75 6e 69 78 47 65 74  yspage = unixGet
268b0 50 61 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20  Pagesize();.    
268c0 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46  i64 nReuse = (pF
268d0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28  d->mmapSize & ~(
268e0 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 20  szSyspage-1));. 
268f0 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
26900 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
26910 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
26920 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
26930 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
26940 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
26950 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
26960 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
26970 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
26980 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
26990 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
269a0 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
269b0 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
269c0 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
269d0 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
269e0 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
269f0 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
26a00 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
26a10 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
26a20 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
26a30 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
26a40 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
26a50 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
26a60 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
26a70 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
26a80 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
26a90 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
26aa0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
26ab0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26ac0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
26ad0 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
26ae0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
26af0 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
26b00 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
26b10 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
26b20 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
26b30 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
26b40 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
26b50 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
26b60 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
26b70 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
26b80 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
26b90 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
26ba0 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
26bb0 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
26bc0 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
26bd0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
26be0 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
26bf0 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
26c00 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
26c10 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
26c20 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
26c30 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
26c40 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
26c50 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
26c60 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
26c70 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
26c80 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
26c90 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
26ca0 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
26cb0 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
26cc0 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
26cd0 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
26ce0 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
26cf0 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
26d00 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
26d10 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
26d20 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
26d30 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
26d40 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
26d50 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
26d60 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
26d70 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
26d80 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
26d90 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
26da0 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
26db0 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
26dc0 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
26dd0 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
26de0 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
26df0 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
26e00 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
26e10 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
26e20 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
26e30 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
26e40 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
26e50 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
26e60 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
26e70 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
26e80 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
26e90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
26ea0 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
26eb0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
26ec0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
26ed0 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
26ee0 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
26ef0 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
26f00 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
26f10 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
26f20 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
26f30 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
26f40 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
26f50 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
26f60 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
26f70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
26f80 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
26f90 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
26fa0 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
26fb0 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
26fc0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
26fd0 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
26fe0 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
26ff0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
27000 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
27010 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
27020 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
27030 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
27040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
27050 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
27060 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
27070 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
27080 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
27090 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
270a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
270b0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
270c0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
270d0 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
270e0 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
270f0 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20 6e   nByte){.  i64 n
27100 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69  Map = nByte;.  i
27110 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
27120 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
27130 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
27140 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
27150 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
27160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
27170 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
27180 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
27190 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
271a0 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
271b0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
271c0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
271d0 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62  t(pFd->h, &statb
271e0 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
271f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27210 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
27220 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20     }.    nMap = 
27230 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b  statbuf.st_size;
27240 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
27250 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
27260 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
27270 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
27280 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70  .  }..  if( nMap
27290 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
272a0 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e  ){.    if( nMap>
272b0 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52  0 ){.      unixR
272c0 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d  emapfile(pFd, nM
272d0 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ap);.    }else{.
272e0 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
272f0 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a  ile(pFd);.    }.
27300 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
27310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
27320 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
27330 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
27340 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
27350 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
27360 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
27370 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
27380 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
27390 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
273a0 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
273b0 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
273c0 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
273d0 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
273e0 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
273f0 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
27400 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
27410 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
27420 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
27430 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
27440 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
27450 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
27460 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
27470 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
27480 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
27490 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
274a0 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
274b0 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
274c0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
274d0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
274e0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
274f0 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
27500 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
27510 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
27520 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73  ually .** releas
27530 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
27540 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55  by calling unixU
27550 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61  nfetch()..*/.sta
27560 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63  tic int unixFetc
27570 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
27580 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
27590 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
275a0 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
275b0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
275c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
275d0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
275e0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
275f0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
27600 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a  le */.#endif.  *
27610 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c  pp = 0;..#if SQL
27620 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
27630 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
27640 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
27650 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
27660 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
27670 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69      int rc = uni
27680 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  xMapfile(pFd, -1
27690 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
276a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
276b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
276c0 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
276d0 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
276e0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
276f0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
27700 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
27710 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
27720 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
27730 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
27740 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27750 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
27760 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
27770 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
27780 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
27790 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
277a0 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
277b0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
277c0 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e   to unixFetch().
277d0 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
277e0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
277f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
27800 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
27810 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
27820 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
27830 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
27840 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74  d to the unixFet
27850 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
27860 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
27870 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
27880 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
27890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
278a0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
278b0 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
278c0 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
278d0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
278e0 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
278f0 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
27900 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
27910 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
27920 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
27930 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63  c int unixUnfetc
27940 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
27950 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
27960 69 64 20 2a 70 29 7b 0a 20 20 75 6e 69 78 46 69  id *p){.  unixFi
27970 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
27980 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
27990 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
279a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
279b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
279c0 52 28 69 4f 66 66 29 3b 0a 0a 23 69 66 20 53 51  R(iOff);..#if SQ
279d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
279e0 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 70 3d 3d  ZE>0.  /* If p==
279f0 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
27a00 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
27a10 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
27a20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
27a30 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
27a40 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
27a50 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
27a60 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
27a70 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
27a80 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
27a90 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
27aa0 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
27ab0 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
27ac0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
27ad0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
27ae0 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
27af0 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
27b00 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
27b10 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
27b20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
27b30 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69  n)[iOff] );..  i
27b40 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
27b50 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
27b60 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55  }else{.    unixU
27b70 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
27b80 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
27b90 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
27ba0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
27bb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27bc0 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
27bd0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
27be0 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
27bf0 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
27c00 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
27c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
27c20 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
27c30 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
27c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c50 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
27c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ca0 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
27cb0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
27cc0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  s definitions of
27cd0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27ce0 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74  ods objects that
27cf0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61  .** implement va
27d00 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69  rious file locki
27d10 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
27d20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  It also contains
27d30 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
27d40 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  of "finder" func
27d50 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72  tions.  A finder
27d60 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65  -function is use
27d70 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
27d80 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73  appropriate.** s
27d90 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
27da0 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70  s object for a p
27db0 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
27dc0 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41  se file.  The pA
27dd0 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20  ppData.** field 
27de0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  of the sqlite3_v
27df0 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61  fs VFS objects a
27e00 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
27e10 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f  o be pointers to
27e20 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
27e30 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
27e40 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a  for that VFS..**
27e50 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20  .** Most finder 
27e60 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
27e70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
27e80 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f  fixed sqlite3_io
27e90 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
27ea0 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e  ct.  The only in
27eb0 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72  teresting finder
27ec0 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74  -function is aut
27ed0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77  olockIoFinder, w
27ee0 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74  hich.** looks at
27ef0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
27f00 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74  type and tries t
27f10 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74  o guess the best
27f20 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61   locking.** stra
27f30 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a  tegy from that..
27f40 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72  **.** For finder
27f50 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20  -funtion F, two 
27f60 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
27f70 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ted:.**.**    (1
27f80 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65  ) The real finde
27f90 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  r-function named
27fa0 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a   "FImpt()"..**.*
27fb0 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74  *    (2) A const
27fc0 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ant pointer to t
27fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  his function nam
27fe0 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a  ed just "F"..**.
27ff0 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
28000 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72  to the F pointer
28010 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
28020 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66  pAppData value f
28030 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74  or VFS.** object
28040 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  s.  We have to d
28050 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f  o this instead o
28060 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61  f letting pAppDa
28070 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65  ta point.** dire
28080 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64  ctly at the find
28090 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63  er-function sinc
280a0 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76  e C90 rules prev
280b0 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66  ent a void*.** f
280c0 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f  rom be cast into
280d0 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
280e0 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61  ter..**.**.** Ea
280f0 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
28100 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61  his macro genera
28110 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a  tes two objects:
28120 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f  .**.**   *  A co
28130 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69  nstant sqlite3_i
28140 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28150 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61   call METHOD tha
28160 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  t has locking.**
28170 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c        methods CL
28180 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
28190 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a  K, CKRESLOCK..**
281a0 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20  .**   *  An I/O 
281b0 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
281c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49  nction called FI
281d0 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e  NDER that return
281e0 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20  s a pointer.**  
281f0 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f      to the METHO
28200 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  D object in the 
28210 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e  previous bullet.
28220 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45  .*/.#define IOME
28230 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45  THODS(FINDER, ME
28240 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43  THOD, VERSION, C
28250 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
28260 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20  CK, CKLOCK)     
28270 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
28280 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28290 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20  ds METHOD = {   
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282c0 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20  \.   VERSION,   
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20   /* iVersion */ 
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28310 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20  .   CLOSE,      
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20  /* xClose */    
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28360 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20     unixRead,    
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28380 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20  * xRead */      
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
283b0 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20    unixWrite,    
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283d0 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20   xWrite */      
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28400 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20   unixTruncate,  
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28420 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20  xTruncate */    
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28450 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20  unixSync,       
28460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28470 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20  Sync */         
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
284a0 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  nixFileSize,    
284b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
284c0 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  ileSize */      
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f           \.   LO
284f0 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
28500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
28510 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28530 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c          \.   UNL
28540 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
28550 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
28560 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f         \.   CKLO
28590 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
285a0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
285b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
285e0 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
285f0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
28600 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20  ontrol */       
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65       \.   unixSe
28630 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
28640 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
28650 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76      \.   unixDev
28680 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
28690 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43  cs,  /* xDeviceC
286a0 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20  apabilities */  
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d     \.   unixShmM
286d0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
286e0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
286f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f    \.   unixShmLo
28720 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28730 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
28740 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72   \.   unixShmBar
28770 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
28780 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
28790 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287b0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61  \.   unixShmUnma
287c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
287d0 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28800 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20  .   unixFetch,  
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20  /* xFetch */    
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28850 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20     unixUnfetch, 
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28870 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20  * xUnfetch */   
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
288a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
288f0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
28900 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
28910 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
28920 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
28930 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
28940 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28950 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
28960 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
28990 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
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 20 20 20 20 20                  
289d0 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20           \.}    
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
28a30 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
28a40 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
28a50 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
28a60 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
28a70 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
28a80 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
28a90 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
28aa0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
28ab0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
28ac0 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
28ad0 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
28ae0 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
28af0 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
28b00 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
28b10 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
28b20 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
28b30 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
28b40 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
28b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
28b60 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
28b70 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
28b80 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
28b90 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
28ba0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
28bb0 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
28be0 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20  ry and mmap are 
28bf0 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  enabled */.  uni
28c00 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
28c10 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
28c20 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
28c30 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
28c40 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
28c50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
28c60 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
28c70 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
28c80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
28c90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
28ca0 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck     /* xCheck
28cb0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
28cc0 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
28cd0 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
28ce0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
28cf0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
28d00 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
28d10 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
28d20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
28d30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28d40 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d60 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
28d70 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
28d80 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  bled */.  nolock
28d90 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28da0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
28db0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
28dc0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
28dd0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
28de0 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
28df0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
28e00 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
28e10 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
28e20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28e30 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
28e40 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
28e50 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
28e60 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
28e70 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
28e80 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
28e90 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
28ea0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
28eb0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
28ec0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28ed0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
28f00 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
28f10 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
28f20 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
28f30 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
28f40 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
28f50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28f60 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
28f70 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
28f80 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
28f90 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
28fa0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
28fb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28fc0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
28fd0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
28fe0 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
28ff0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29000 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
29010 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
29020 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  flockIoFinder,  
29030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29040 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29050 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65  e */.  flockIoMe
29060 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29070 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29080 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29090 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
290c0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
290d0 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
290f0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29100 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29120 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29130 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29150 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29160 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
29170 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
29180 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29190 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
291a0 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
291b0 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
291c0 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
291e0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
291f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
29200 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29210 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29220 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29230 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29250 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29260 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
29270 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65  ed */.  semClose
29280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29290 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
292a0 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c  od */.  semLock,
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
292d0 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b  d */.  semUnlock
292e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
292f0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
29300 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b  od */.  semCheck
29310 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
29320 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
29330 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
29340 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
29350 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29360 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
29370 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29380 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
29390 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
293a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
293b0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
293c0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
293d0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
293e0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
293f0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
29400 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29430 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29440 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29460 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29470 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29490 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
294a0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
294b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
294c0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
294d0 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
294e0 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
294f0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29500 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
29510 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
29520 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
29530 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
29540 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
29550 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
29560 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
29570 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
29580 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
29590 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
295a0 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
295b0 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
295c0 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
295d0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
295e0 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
295f0 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
29600 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
29610 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
29620 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
29630 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
29640 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
29650 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
29660 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
29670 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
29680 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
29690 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
296a0 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
296b0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
296c0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
296d0 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
296e0 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
296f0 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
29700 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
29710 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29720 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29730 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
29740 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
29750 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
29760 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
29770 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
29780 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
29790 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
297a0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
297b0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
297c0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
297d0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
297e0 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
297f0 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
29800 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29810 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29820 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
29830 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
29840 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29850 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29860 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29880 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29890 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
298a0 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
298b0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
298c0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
298d0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
298e0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
298f0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29900 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
29910 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
29920 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29930 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
29940 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29950 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
29960 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29970 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
29980 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
29990 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
299a0 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
299b0 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
299c0 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
299d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
299e0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
299f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29a00 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
29a10 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
29a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29a30 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29a40 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
29a50 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29a60 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29a70 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29a80 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29ab0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
29ac0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
29ad0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29ae0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
29af0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
29b00 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29b10 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
29b20 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
29b30 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29b40 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29b50 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
29b60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29b70 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
29b80 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29b90 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
29ba0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
29bb0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29bc0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29bd0 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
29be0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
29bf0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
29c00 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
29c10 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
29c20 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
29c30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
29c40 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
29c50 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
29c60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29c70 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
29c80 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
29c90 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
29ca0 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
29cb0 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
29cc0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
29cd0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
29ce0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
29cf0 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
29d00 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
29d10 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
29d20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
29d30 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
29d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
29d50 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
29d60 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
29d70 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
29d80 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
29d90 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
29da0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
29db0 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
29dc0 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
29dd0 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
29de0 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
29df0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
29e00 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
29e10 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
29e20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
29e30 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
29e40 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
29e50 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
29e60 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
29e70 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
29e80 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
29e90 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
29ea0 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
29eb0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
29ec0 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
29ed0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
29ee0 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
29ef0 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
29f00 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
29f10 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
29f20 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
29f30 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
29f40 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
29f50 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
29f60 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
29f70 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
29f80 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
29f90 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
29fa0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
29fb0 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
29fc0 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
29fd0 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
29fe0 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
29ff0 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
2a000 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
2a010 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
2a020 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
2a030 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2a040 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2a050 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
2a060 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
2a070 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2a080 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
2a090 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
2a0a0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2a0b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a0c0 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
2a0d0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
2a0e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2a0f0 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
2a100 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
2a110 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
2a120 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
2a130 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
2a140 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
2a150 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
2a160 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
2a170 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2a180 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
2a190 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
2a1a0 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2a1b0 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2a1c0 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2a1d0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2a1e0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2a1f0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2a200 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2a210 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2a220 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2a230 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2a240 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
2a250 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2a260 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
2a270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
2a280 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
2a290 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2a2a0 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
2a2b0 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2a2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2a2d0 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
2a2e0 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
2a2f0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a300 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
2a310 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
2a320 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2a330 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2a340 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
2a350 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
2a360 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
2a370 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2a380 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a390 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
2a3a0 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
2a3b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a3c0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
2a3d0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2a3e0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2a3f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
2a400 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
2a410 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
2a420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
2a430 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
2a440 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
2a450 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a460 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
2a470 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
2a480 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
2a490 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58  * This is for VX
2a4a0 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  Works only..*/.s
2a4b0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a4c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2a4d0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2a4e0 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2a4f0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2a500 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2a510 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2a520 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2a530 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
2a540 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
2a550 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2a560 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2a570 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2a580 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2a590 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2a5a0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2a5b0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2a5c0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2a5d0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2a5e0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a5f0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2a600 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2a610 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
2a620 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
2a630 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
2a640 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
2a650 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
2a660 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
2a670 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
2a680 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
2a690 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
2a6a0 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2a6b0 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2a6c0 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2a6d0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2a6e0 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2a6f0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2a700 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2a710 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2a720 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2a730 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
2a740 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2a750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2a760 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
2a770 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2a780 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a790 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2a7a0 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2a7b0 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2a7c0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2a7d0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2a7e0 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2a7f0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
2a800 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2a810 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
2a820 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
2a830 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
2a840 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
2a850 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
2a860 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
2a870 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a880 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
2a890 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
2a8a0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
2a8b0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a900 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
2a920 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
2a930 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
2a940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2a950 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
2a960 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
2a970 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2a980 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
2a990 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
2a9a0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
2a9b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2a9c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2a9d0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2a9e0 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
2a9f0 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
2aa00 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
2aa10 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
2aa20 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
2aa30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
2aa40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2aa50 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
2aa60 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
2aa70 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
2aa80 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2aa90 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2aaa0 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
2aab0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
2aac0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2aad0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2aae0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2aaf0 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
2ab00 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2ab10 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74  ened */.  int ct
2ab20 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
2ab30 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
2ab40 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c  e UNIXFILE_* val
2ab50 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ues */.){.  cons
2ab60 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2ab70 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
2ab80 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
2ab90 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
2aba0 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
2abb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2abc0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2abd0 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
2abe0 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68  .  /* Usually th
2abf0 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65  e path zFilename
2ac00 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
2ac10 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
2ac20 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63  me. The.  ** exc
2ac30 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f  eption is when o
2ac40 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79  pening the proxy
2ac50 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e   "conch" file in
2ac60 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a   builds that.  *
2ac70 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70  * include the sp
2ac80 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b  ecial Apple lock
2ac90 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f  ing styles..  */
2aca0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2acb0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2acc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2acd0 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28  _STYLE.  assert(
2ace0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
2acf0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
2ad00 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d  /' .    || pVfs-
2ad10 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64  >pAppData==(void
2ad20 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
2ad30 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61  der );.#else.  a
2ad40 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2ad50 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
2ad60 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64  [0]=='/' );.#end
2ad70 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b  if..  /* No lock
2ad80 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65  ing occurs in te
2ad90 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
2ada0 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
2adb0 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c  name!=0 || (ctrl
2adc0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2add0 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a  _NOLOCK)!=0 );..
2ade0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
2adf0 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
2ae00 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
2ae10 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
2ae20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56   pNew->pVfs = pV
2ae30 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74  fs;.  pNew->zPat
2ae40 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2ae50 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2ae60 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73   = (u8)ctrlFlags
2ae70 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
2ae80 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
2ae90 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  New->mmapSizeMax
2aea0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
2aeb0 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23  Config.szMmap;.#
2aec0 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
2aed0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2aee0 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
2aef0 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
2af00 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
2af30 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
2af40 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
2af50 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2af60 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2af70 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
2af80 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  strcmp(pVfs->zNa
2af90 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d  me,"unix-excl")=
2afa0 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
2afb0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2afc0 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a  XFILE_EXCL;.  }.
2afd0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2afe0 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
2aff0 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
2b000 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2b010 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
2b020 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20  {.    ctrlFlags 
2b030 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
2b040 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  CK;.    rc = SQL
2b050 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
2b060 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72  endif..  if( ctr
2b070 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2b080 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
2b090 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2b0a0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2b0b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2b0c0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2b0d0 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2b0e0 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2b0f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2b100 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2b110 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b120 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2b130 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2b140 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2b150 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2b160 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2b170 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2b180 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2b190 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2b1a0 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2b1b0 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2b1c0 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2b1d0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2b1e0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2b1f0 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2b200 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2b210 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2b220 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2b230 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2b240 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2b250 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2b260 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b270 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2b280 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b290 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2b2a0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2b2b0 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2b2c0 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
2b2d0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2b2e0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2b2f0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2b300 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2b310 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b320 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
2b330 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2b340 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
2b350 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
2b360 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
2b370 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
2b380 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
2b390 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
2b3a0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
2b3b0 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
2b3c0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
2b3d0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
2b3e0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
2b3f0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
2b400 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
2b410 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
2b420 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
2b430 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
2b440 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
2b450 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
2b460 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
2b470 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
2b480 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2b490 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2b4a0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2b4b0 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
2b4c0 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
2b4d0 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
2b4e0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
2b4f0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
2b500 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2b510 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
2b520 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2b530 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
2b540 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
2b550 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
2b560 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
2b570 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
2b580 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
2b590 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
2b5a0 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
2b5b0 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
2b5c0 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
2b5d0 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
2b5e0 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
2b5f0 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
2b600 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
2b610 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
2b620 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
2b630 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
2b640 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
2b650 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
2b660 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
2b670 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
2b680 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
2b690 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
2b6a0 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
2b6b0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2b6c0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2b6d0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
2b6e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2b6f0 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
2b700 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b710 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2b720 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2b730 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2b740 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
2b750 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2b760 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
2b770 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2b780 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2b790 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2b7a0 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
2b7b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
2b7c0 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
2b7d0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2b7e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
2b7f0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
2b800 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2b810 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
2b820 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
2b830 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
2b840 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2b850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b860 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61    /* NB: zFilena
2b870 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65  me exists and re
2b880 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
2b890 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c  l the file is cl
2b8a0 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63  osed.      ** ac
2b8b0 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
2b8c0 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
2b8d0 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
2b8e0 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
2b8f0 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
2b900 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20   filename. */.  
2b910 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
2b920 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2b930 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76      pCtx->reserv
2b940 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72  ed = 0;.      sr
2b950 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20  andomdev();.    
2b960 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2b970 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ();.      rc = f
2b980 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2b990 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2b9a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2b9b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2b9d0 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67  ee(pNew->locking
2b9e0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
2b9f0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2ba00 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2ba10 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d  );.        h = -
2ba20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2ba30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2ba40 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d  );        .    }
2ba50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65  .  }.#endif..  e
2ba60 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2ba70 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63  Style == &dotloc
2ba80 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
2ba90 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63    /* Dotfile loc
2baa0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2bab0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2bac0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2bad0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2bae0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
2baf0 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20  ontext .    */. 
2bb00 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69     char *zLockFi
2bb10 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c  le;.    int nFil
2bb20 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  ename;.    asser
2bb30 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2bb40 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  );.    nFilename
2bb50 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2bb60 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
2bb70 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
2bb80 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
2bb90 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
2bba0 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46  ;.    if( zLockF
2bbb0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2bbc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2bbd0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2bbe0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2bbf0 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
2bc00 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20  zLockFile, "%s" 
2bc10 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20  DOTLOCK_SUFFIX, 
2bc20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2bc30 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  }.    pNew->lock
2bc40 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f  ingContext = zLo
2bc50 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  ckFile;.  }..#if
2bc60 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c   OS_VXWORKS.  el
2bc70 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2bc80 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65  tyle == &semIoMe
2bc90 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2bca0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
2bcb0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
2bcc0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
2bcd0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
2bce0 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   ** included in 
2bcf0 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f  the semLockingCo
2bd00 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20  ntext.    */.   
2bd10 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2bd20 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
2bd30 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2bd40 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2bd50 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
2bd60 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77  ITE_OK) && (pNew
2bd70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d  ->pInode->pSem==
2bd80 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63  NULL) ){.      c
2bd90 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20  har *zSemName = 
2bda0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
2bdb0 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  emName;.      in
2bdc0 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t n;.      sqlit
2bdd0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
2bde0 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61  PATHNAME, zSemNa
2bdf0 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20  me, "/%s.sem",. 
2be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be10 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d        pNew->pId-
2be20 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
2be30 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31  ;.      for( n=1
2be40 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e  ; zSemName[n]; n
2be50 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28  ++ ).        if(
2be60 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f   zSemName[n]=='/
2be70 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20  ' ) zSemName[n] 
2be80 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65  = '_';.      pNe
2be90 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2bea0 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e  = sem_open(zSemN
2beb0 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36  ame, O_CREAT, 06
2bec0 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  66, 1);.      if
2bed0 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  ( pNew->pInode->
2bee0 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c  pSem == SEM_FAIL
2bef0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ED ){.        rc
2bf00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2bf10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2bf20 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
2bf30 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
2bf40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
2bf50 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2bf60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70   }.#endif.  .  p
2bf70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  New->lastErrno =
2bf80 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   0;.#if OS_VXWOR
2bf90 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  KS.  if( rc!=SQL
2bfa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2bfb0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2bfc0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2bfd0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20  _LINE__);.    h 
2bfe0 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69  = -1;.    osUnli
2bff0 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
2c000 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2c010 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
2c020 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69  ELETE;.  }.#endi
2c030 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
2c040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2c050 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2c060 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2c070 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
2c080 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
2c090 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
2c0a0 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
2c0b0 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65  nter(+1);.    ve
2c0c0 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29  rifyDbFile(pNew)
2c0d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2c0e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2c0f0 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
2c100 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68   directory in wh
2c110 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f  ich to put tempo
2c120 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49  rary files..** I
2c130 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65  f no suitable te
2c140 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72  mporary file dir
2c150 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f  ectory can be fo
2c160 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  und, return NULL
2c170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2c180 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70  t char *unixTemp
2c190 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20  FileDir(void){. 
2c1a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
2c1b0 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
2c1c0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
2c1d0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
2c1e0 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
2c1f0 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
2c200 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20  "/tmp",.     0  
2c210 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
2c220 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b  rminator */.  };
2c230 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
2c240 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2c250 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
2c260 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20  ar *zDir = 0;.. 
2c270 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
2c280 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
2c290 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  ory;.  if( !azDi
2c2a0 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
2c2b0 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
2c2c0 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69  TE_TMPDIR");.  i
2c2d0 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20  f( !azDirs[2] ) 
2c2e0 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65  azDirs[2] = gete
2c2f0 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
2c300 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2c310 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
2c320 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69  (azDirs[0]); zDi
2c330 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a  r=azDirs[i++]){.
2c340 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
2c350 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c360 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c  if( osStat(zDir,
2c370 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
2c380 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
2c390 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
2c3a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c3b0 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44   if( osAccess(zD
2c3c0 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  ir, 07) ) contin
2c3d0 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ue;.    break;. 
2c3e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72   }.  return zDir
2c3f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2c400 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
2c410 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
2c420 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61    zBuf must be a
2c430 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
2c440 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
2c450 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62  ss and must be b
2c460 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
2c470 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56  d at least.** pV
2c480 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62  fs->mxPathname b
2c490 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
2c4a0 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
2c4b0 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
2c4c0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
2c4d0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
2c4e0 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
2c4f0 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
2c500 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
2c510 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
2c520 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
2c530 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
2c540 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65  6789";.  unsigne
2c550 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f  d int i, j;.  co
2c560 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a  nst char *zDir;.
2c570 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2c580 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2c590 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2c5a0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2c5b0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2c5c0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2c5d0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2c5e0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2c5f0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2c600 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2c610 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
2c620 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2c630 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2c640 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e   );..  zDir = un
2c650 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b  ixTempFileDir();
2c660 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29  .  if( zDir==0 )
2c670 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20   zDir = ".";..  
2c680 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2c690 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
2c6a0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
2c6b0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
2c6c0 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
2c6d0 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
2c6e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2c6f0 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  RROR..  */.  if(
2c700 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b   (strlen(zDir) +
2c710 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54   strlen(SQLITE_T
2c720 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
2c730 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f   + 18) >= (size_
2c740 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65  t)nBuf ){.    re
2c750 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2c760 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  R;.  }..  do{.  
2c770 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2c780 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66  tf(nBuf-18, zBuf
2c790 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
2c7a0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
2c7b0 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28  zDir);.    j = (
2c7c0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29  int)strlen(zBuf)
2c7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
2c7e0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
2c7f0 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
2c800 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
2c810 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
2c820 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
2c830 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
2c840 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
2c850 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
2c860 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
2c870 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42  f[j] = 0;.    zB
2c880 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d  uf[j+1] = 0;.  }
2c890 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28  while( osAccess(
2c8a0 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
2c8b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c8c0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2c8d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c8e0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
2c8f0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
2c900 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
2c910 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
2c920 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
2c930 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
2c940 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2c950 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
2c960 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
2c970 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
2c980 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
2c990 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2c9a0 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
2c9b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c9c0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2c9d0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
2c9e0 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
2c9f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
2ca00 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2ca10 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2ca20 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  tor that was ope
2ca30 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
2ca40 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f  ase .** file (no
2ca50 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d  t a journal or m
2ca60 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
2ca70 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62  le) identified b
2ca80 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50  y pathname.** zP
2ca90 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ath with SQLITE_
2caa0 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d  OPEN_XXX flags m
2cab0 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61  atching those pa
2cac0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2cad0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  nd.** argument t
2cae0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
2caf0 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69  .**.** Such a fi
2cb00 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61  le descriptor ma
2cb10 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74  y exist if a dat
2cb20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2cb30 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62   was closed.** b
2cb40 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
2cb50 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2cb60 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  r could not be c
2cb70 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f  losed because so
2cb80 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65  me.** other file
2cb90 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
2cba0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
2cbb0 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66  e is holding a f
2cbc0 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66  ile-lock..** Ref
2cbd0 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69  er to comments i
2cbe0 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28  n the unixClose(
2cbf0 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74  ) function and t
2cc00 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65  he lengthy comme
2cc10 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  nt.** describing
2cc20 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79   "Posix Advisory
2cc30 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65   Locking" at the
2cc40 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66   start of this f
2cc50 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74  ile for .** furt
2cc60 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73  her details. Als
2cc70 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e  o, ticket #4018.
2cc80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74  .**.** If a suit
2cc90 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
2cca0 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  ptor is found, t
2ccb0 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e  hen it is return
2ccc0 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63  ed. If no.** suc
2ccd0 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
2cce0 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31  r is located, -1
2ccf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2cd00 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73  .static UnixUnus
2cd10 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62  edFd *findReusab
2cd20 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leFd(const char 
2cd30 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67  *zPath, int flag
2cd40 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  s){.  UnixUnused
2cd50 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b  Fd *pUnused = 0;
2cd60 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65  ..  /* Do not se
2cd70 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2cd80 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2cd90 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e  or on vxworks. N
2cda0 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  ot because.  ** 
2cdb0 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f  vxworks would no
2cdc0 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74  t benefit from t
2cdd0 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69  he change (it mi
2cde0 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73  ght, we're not s
2cdf0 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62  ure),.  ** but b
2ce00 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f  ecause no way to
2ce10 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72   test it is curr
2ce20 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e  ently available.
2ce30 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20   It is better . 
2ce40 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20   ** not to risk 
2ce50 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73  breaking vxworks
2ce60 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
2ce70 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e   sake of such an
2ce80 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66   obscure .  ** f
2ce90 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20  eature.  */.#if 
2cea0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74  !OS_VXWORKS.  st
2ceb0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ced0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66     /* Results of
2cee0 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a   stat() call */.
2cef0 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63  .  /* A stat() c
2cf00 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72  all may fail for
2cf10 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73   various reasons
2cf20 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
2cf30 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c  s, it is.  ** al
2cf40 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
2cf50 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c  t an open() call
2cf60 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2cf70 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c  h will also fail
2cf80 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20  ..  ** For this 
2cf90 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72  reason, if an er
2cfa0 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
2cfb0 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65  e stat() call he
2cfc0 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  re, it is.  ** i
2cfd0 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73  gnored and -1 is
2cfe0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
2cff0 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74  aller will try t
2d000 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
2d010 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
2d020 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  r on the same pa
2d030 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65  th, fail, and re
2d040 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f  turn an error to
2d050 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20   SQLite..  **.  
2d060 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62  ** Even if a sub
2d070 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63  sequent open() c
2d080 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64  all does succeed
2d090 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63  , the consequenc
2d0a0 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73  es of.  ** not s
2d0b0 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72  earching for a r
2d0c0 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  esusable file de
2d0d0 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
2d0e0 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
2d0f0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2d100 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2d110 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2d120 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
2d130 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2d140 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
2d150 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
2d160 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
2d170 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
2d180 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
2d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1a0 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
2d1b0 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
2d1c0 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
2d1d0 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
2d1e0 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
2d1f0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
2d200 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
2d210 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
2d220 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
2d230 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
2d240 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
2d250 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
2d260 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
2d270 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
2d280 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
2d290 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
2d2a0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
2d2b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2d2c0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2d2d0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2d2e0 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
2d2f0 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
2d300 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
2d310 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d320 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2d330 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
2d340 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
2d350 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
2d360 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
2d370 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
2d380 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2d390 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
2d3a0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
2d3b0 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65  a value suitable
2d3c0 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20   for passing as 
2d3d0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2d3e0 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73  nt to open(2) is
2d3f0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
2d400 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20  pMode. If an IO 
2d410 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2d420 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2d430 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
2d440 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2d450 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f   of *pMode is no
2d460 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  t modified..**.*
2d470 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  * In most cases 
2d480 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74  cases, this rout
2d490 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  ine sets *pMode 
2d4a0 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c  to 0, which will
2d4b0 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e   become.** an in
2d4c0 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75  dication to robu
2d4d0 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65  st_open() to cre
2d4e0 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69  ate the file usi
2d4f0 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46  ng.** SQLITE_DEF
2d500 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2d510 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62  SIONS adjusted b
2d520 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
2d530 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20  But if the file 
2d540 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
2d550 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72  a WAL or regular
2d560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
2d570 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
2d580 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68  ction queries th
2d590 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2d5a0 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  r the permission
2d5b0 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72  s on the .** cor
2d5c0 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62  responding datab
2d5d0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ase file and set
2d5e0 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73  s *pMode to this
2d5f0 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72   value. Whenever
2d600 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57   .** possible, W
2d610 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  AL and journal f
2d620 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
2d630 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2d640 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
2d650 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  as the associate
2d660 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
2d670 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  .**.** If the SQ
2d680 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2d690 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20  NAMES option is 
2d6a0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
2d6b0 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69  e.** original fi
2d6c0 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69  lename is unavai
2d6d0 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f  lable.  But 8_3_
2d6e0 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73  NAMES is only us
2d6f0 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69  ed for.** FAT fi
2d700 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65  lesystems and pe
2d710 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74  rmissions do not
2d720 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73   matter there, s
2d730 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68  o just use.** th
2d740 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73  e default permis
2d750 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
2d760 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46   int findCreateF
2d770 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ileMode(.  const
2d780 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2d790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2d7a0 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73  th of file (poss
2d7b0 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61  ibly) being crea
2d7c0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ted */.  int fla
2d7d0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2d7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2d7f0 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20  s passed as 4th 
2d800 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65  argument to xOpe
2d810 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20  n() */.  mode_t 
2d820 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pMode,         
2d830 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d840 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2d850 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a  open file with *
2d860 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c  /.  uid_t *pUid,
2d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d880 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20      /* OUT: uid 
2d890 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
2d8a0 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  le */.  gid_t *p
2d8b0 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
2d8c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d8d0 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  gid to set on th
2d8e0 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  e file */.){.  i
2d8f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d900 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2d910 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2d920 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20  .  *pMode = 0;. 
2d930 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70   *pUid = 0;.  *p
2d940 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66  Gid = 0;.  if( f
2d950 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
2d960 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
2d970 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2d980 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44  ) ){.    char zD
2d990 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  b[MAX_PATHNAME+1
2d9a0 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ];     /* Databa
2d9b0 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  se file path */.
2d9c0 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20      int nDb;    
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
2d9f0 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44  alid bytes in zD
2da00 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  b */.    struct 
2da10 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2da20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2da30 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61   of stat() on da
2da40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2da50 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20      /* zPath is 
2da60 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20  a path to a WAL 
2da70 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  or journal file.
2da80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2da90 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20  lock derives.   
2daa0 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20   ** the path to 
2dab0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
2dac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f  atabase file fro
2dad0 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c  m zPath. This bl
2dae0 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20  ock handles.    
2daf0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
2db00 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69   naming conventi
2db10 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ons:.    **.    
2db20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2db30 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20  b>-journal".    
2db40 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2db50 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20  b>-wal".    **  
2db60 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
2db70 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  ournalNN".    **
2db80 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2db90 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20  -walNN".    **. 
2dba0 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69     ** where NN i
2dbb0 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62  s a decimal numb
2dbc0 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e  er. The NN namin
2dbd0 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20  g schemes are . 
2dbe0 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
2dbf0 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78  e test_multiplex
2dc00 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a  .c module..    *
2dc10 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69  /.    nDb = sqli
2dc20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2dc30 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20  h) - 1; .#ifdef 
2dc40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
2dc50 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c  3_NAMES.    whil
2dc60 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69  e( nDb>0 && sqli
2dc70 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68  te3Isalnum(zPath
2dc80 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a  [nDb]) ) nDb--;.
2dc90 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c      if( nDb==0 |
2dca0 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  | zPath[nDb]!='-
2dcb0 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ' ) return SQLIT
2dcc0 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  E_OK;.#else.    
2dcd0 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62  while( zPath[nDb
2dce0 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
2dcf0 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b  assert( nDb>0 );
2dd00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
2dd10 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20  Path[nDb]!='\n' 
2dd20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a  );.      nDb--;.
2dd30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2dd40 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61   memcpy(zDb, zPa
2dd50 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44  th, nDb);.    zD
2dd60 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a  b[nDb] = '\0';..
2dd70 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
2dd80 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29  t(zDb, &sStat) )
2dd90 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d  {.      *pMode =
2dda0 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26   sStat.st_mode &
2ddb0 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55   0777;.      *pU
2ddc0 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
2ddd0 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d  d;.      *pGid =
2dde0 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20   sStat.st_gid;. 
2ddf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2de00 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2de10 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
2de20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
2de30 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2de40 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
2de50 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
2de60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2de70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
2de80 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68  n the file zPath
2de90 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75  ..** .** Previou
2dea0 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
2deb0 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
2dec0 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
2ded0 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
2dee0 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
2def0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2df00 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
2df10 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2df20 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
2df30 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
2df40 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
2df50 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
2df60 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
2df70 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
2df80 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
2df90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
2dfa0 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
2dfb0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2dfc0 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
2dfd0 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
2dfe0 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
2dff0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2e000 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
2e010 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
2e020 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
2e030 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
2e040 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
2e050 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
2e060 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
2e070 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
2e080 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
2e090 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
2e0a0 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
2e0b0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
2e0c0 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
2e0d0 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
2e0e0 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
2e0f0 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
2e100 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
2e110 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
2e120 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
2e130 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
2e140 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
2e150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2e160 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nixOpen(.  sqlit
2e170 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2e180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
2e190 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  FS for which thi
2e1a0 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d  s is the xOpen m
2e1b0 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2e1c0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2e1d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e          /* Pathn
2e1e0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2e1f0 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  e opened */.  sq
2e200 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2e210 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2e220 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2e230 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  r to be filled i
2e240 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  n */.  int flags
2e250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e260 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61      /* Input fla
2e270 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  gs to control th
2e280 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69  e opening */.  i
2e290 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e2b0 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75  utput flags retu
2e2c0 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63  rned to SQLite c
2e2d0 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ore */.){.  unix
2e2e0 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
2e2f0 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
2e300 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  nt fd = -1;     
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e320 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2e330 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65   returned by ope
2e340 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  n() */.  int ope
2e350 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
2e360 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2e370 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
2e380 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
2e390 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
2e3a0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
2e3b0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
2e3c0 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20  /.  int noLock; 
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3e0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2e3f0 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  it locking primi
2e400 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tives */.  int r
2e410 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2e420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
2e430 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
2e440 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  e */.  int ctrlF
2e450 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2e460 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c        /* UNIXFIL
2e470 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  E_* flags */..  
2e480 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
2e490 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2e4a0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
2e4b0 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
2e4c0 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
2e4d0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2e4e0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
2e4f0 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
2e500 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2e510 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
2e520 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
2e530 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
2e540 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2e550 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
2e560 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
2e570 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e580 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
2e590 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2e5a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
2e5b0 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
2e5c0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e5d0 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
2e5e0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
2e5f0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2e600 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2e610 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2e620 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2e630 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20  sInfo;.#endif.. 
2e640 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
2e650 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
2e660 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
2e670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
2e680 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
2e690 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
2e6a0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
2e6b0 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
2e6c0 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
2e6d0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
2e6e0 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
2e6f0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2e700 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
2e710 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
2e720 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20    int syncDir = 
2e730 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
2e740 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
2e750 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2e760 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2e770 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e780 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2e790 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2e7a0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2e7b0 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
2e7c0 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
2e7d0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
2e7e0 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2e7f0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
2e800 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
2e810 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
2e820 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
2e830 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
2e840 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
2e850 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
2e860 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63  PATHNAME+2];.  c
2e870 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2e880 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
2e890 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
2e8a0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
2e8b0 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
2e8c0 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
2e8d0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
2e8e0 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
2e8f0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
2e900 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
2e910 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
2e920 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
2e930 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
2e940 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
2e950 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
2e960 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
2e970 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2e980 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
2e990 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
2e9a0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
2e9b0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
2e9c0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
2e9d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
2e9e0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
2e9f0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
2ea00 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
2ea10 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
2ea20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
2ea30 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2ea40 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2ea50 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
2ea60 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
2ea70 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
2ea80 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
2ea90 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
2eaa0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
2eab0 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
2eac0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
2ead0 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
2eae0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
2eaf0 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
2eb00 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
2eb10 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
2eb20 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2eb30 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2eb40 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2eb50 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
2eb60 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2eb70 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2eb80 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2eb90 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2eba0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2ebb0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2ebc0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2ebd0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2ebe0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2ebf0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2ec00 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2ec10 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
2ec20 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
2ec30 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
2ec40 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
2ec50 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
2ec60 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
2ec70 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
2ec80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2ec90 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2eca0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2ecb0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
2ecc0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ecd0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
2ece0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2ecf0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
2ed00 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2ed10 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ed20 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
2ed30 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ed40 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2ed50 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2ed60 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ed70 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
2ed80 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ed90 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d  EN_WAL.  );..  m
2eda0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
2edb0 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
2edc0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
2edd0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2ede0 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
2edf0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
2ee00 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
2ee10 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
2ee20 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
2ee30 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2ee40 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
2ee50 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
2ee60 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2ee70 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2ee80 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2ee90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
2eea0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2eeb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2eec0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2eed0 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73    }.    p->pUnus
2eee0 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20  ed = pUnused;.. 
2eef0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
2ef00 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75  ilenames are dou
2ef10 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
2ef20 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ted if they are 
2ef30 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20  not.    ** URIs 
2ef40 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
2ef50 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
2ef60 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
2ef70 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73  ed into.    ** s
2ef80 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
2ef90 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
2efa0 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
2efb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
2efc0 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e   || zName[strlen
2efd0 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2efe0 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ..  }else if( !z
2eff0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
2f000 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
2f010 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2f020 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
2f030 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
2f040 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
2f050 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b  te && !syncDir);
2f060 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
2f070 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
2f080 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61  THNAME+2, zTmpna
2f090 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
2f0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f0b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f0c0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
2f0d0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20   zTmpname;..    
2f0e0 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d  /* Generated tem
2f0f0 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73  porary filenames
2f100 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62   are always doub
2f110 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
2f120 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73  ed.    ** for us
2f130 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69  e by sqlite3_uri
2f140 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
2f150 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61  .    assert( zNa
2f160 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2f170 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  +1]==0 );.  }.. 
2f180 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
2f190 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
2f1a0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
2f1b0 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
2f1c0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
2f1d0 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
2f1e0 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
2f1f0 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
2f200 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
2f210 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
2f220 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
2f230 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
2f240 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
2f250 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
2f260 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
2f270 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
2f280 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
2f290 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
2f2a0 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
2f2b0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
2f2c0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
2f2d0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
2f2e0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
2f2f0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
2f300 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
2f310 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
2f320 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
2f330 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
2f340 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
2f350 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
2f360 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2f370 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
2f380 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
2f390 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
2f3a0 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
2f3b0 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74  ith */.    uid_t
2f3c0 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   uid;           
2f3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
2f3e0 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
2f3f0 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64  */.    gid_t gid
2f400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f410 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20       /* Groupid 
2f420 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
2f430 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65      rc = findCre
2f440 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d  ateFileMode(zNam
2f450 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d  e, flags, &openM
2f460 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29  ode, &uid, &gid)
2f470 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f490 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e   assert( !p->pUn
2f4a0 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73  used );.      as
2f4b0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
2f4c0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20  ITE_OPEN_WAL || 
2f4d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f4e0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2f4f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2f500 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64  rc;.    }.    fd
2f510 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
2f520 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
2f530 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
2f540 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
2f550 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
2f560 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
2f570 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  nFlags));.    if
2f580 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
2f590 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
2f5a0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
2f5b0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
2f5c0 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
2f5d0 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
2f5e0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2f5f0 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
2f600 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
2f610 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
2f620 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2f630 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
2f640 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
2f650 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
2f660 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
2f670 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2f680 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2f690 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2f6a0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73  RDONLY;.      is
2f6b0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
2f6c0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
2f6d0 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
2f6e0 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
2f6f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f700 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  fd<0 ){.      rc
2f710 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
2f720 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2f730 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e  BKPT, "open", zN
2f740 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
2f750 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2f760 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2f770 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2f780 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
2f790 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67   and if creating
2f7a0 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a   a new rollback.
2f7b0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f      ** journal o
2f7c0 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20  r WAL file, set 
2f7d0 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  the ownership of
2f7e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
2f7f0 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  WAL to be.    **
2f800 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2f810 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
2f820 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2f830 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2f840 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2f850 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f860 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 6f  RNAL) ){.      o
2f870 73 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c  sFchown(fd, uid,
2f880 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   gid);.    }.  }
2f890 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
2f8a0 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
2f8b0 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
2f8c0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
2f8d0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e   }..  if( p->pUn
2f8e0 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
2f8f0 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2f900 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
2f910 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
2f920 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
2f930 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
2f940 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
2f950 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20  = zName;.#else. 
2f960 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
2f970 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
2f980 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2f990 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2f9a0 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
2f9b0 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
2f9c0 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
2f9d0 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
2f9e0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f9f0 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20  AIN_DB;..  .#if 
2fa00 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2fa10 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
2fa20 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2fa30 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28  E.  if( fstatfs(
2fa40 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  fd, &fsInfo) == 
2fa50 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  -1 ){.    ((unix
2fa60 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61  File*)pFile)->la
2fa70 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
2fa80 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
2fa90 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
2faa0 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  _);.    return S
2fab0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
2fac0 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  SS;.  }.  if (0 
2fad0 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
2fae0 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
2faf0 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
2fb00 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
2fb10 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
2fb20 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
2fb30 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
2fb40 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
2fb50 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  up appropriate c
2fb60 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66  trlFlags */.  if
2fb70 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20  ( isDelete )    
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
2fb90 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2fba0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20  E_DELETE;.  if( 
2fbb0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20  isReadonly )    
2fbc0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
2fbd0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2fbe0 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f  RDONLY;.  if( no
2fbf0 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20  Lock )          
2fc00 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
2fc10 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
2fc20 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63  LOCK;.  if( sync
2fc30 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20  Dir )           
2fc40 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
2fc50 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  |= UNIXFILE_DIRS
2fc60 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  YNC;.  if( flags
2fc70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
2fc80 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c  RI ) ctrlFlags |
2fc90 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a  = UNIXFILE_URI;.
2fca0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2fcb0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2fcc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
2fcd0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2fce0 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
2fcf0 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
2fd00 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
2fd10 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
2fd20 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
2fd30 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
2fd40 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
2fd50 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
2fd60 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2fd70 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
2fd80 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
2fd90 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
2fda0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2fdb0 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
2fdc0 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
2fdd0 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
2fde0 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
2fdf0 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
2fe00 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
2fe10 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
2fe20 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
2fe30 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
2fe40 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2fe50 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
2fe60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2fe70 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a      if( statfs(z
2fe80 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
2fe90 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
2fea0 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
2feb0 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c  e close(fd) call
2fec0 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e   is sub-optimal.
2fed0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
2fee0 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ned.        ** w
2fef0 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61  ith fd is a data
2ff00 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74  base file, and t
2ff10 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63  here are other c
2ff20 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a  onnections open.
2ff30 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
2ff40 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
2ff50 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69   currently holdi
2ff60 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ng advisory lock
2ff70 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20  s on it,.       
2ff80 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c   ** then the cal
2ff90 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c  l to close() wil
2ffa0 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c  l cancel those l
2ffb0 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ocks. In practic
2ffc0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  e,.        ** we
2ffd0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61  're assuming tha
2ffe0 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e  t statfs() doesn
2fff0 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74  't fail very oft
30000 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20  en. At least.   
30010 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c       ** not whil
30020 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  e other file des
30030 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
30040 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
30050 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ess on.        *
30060 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  * the same file 
30070 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f  are working.  */
30080 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74  .        p->last
30090 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
300a0 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
300b0 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
300c0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  E__);.        rc
300d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
300e0 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20  ACCESS;.        
300f0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
30100 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
30110 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
30120 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
30130 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
30140 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
30150 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
30160 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
30170 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
30180 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
30190 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
301a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
301b0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
301c0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
301d0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
301e0 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
301f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30210 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
30220 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
30230 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
30240 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
30250 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
30260 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
30270 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
30280 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
30290 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
302a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
302b0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
302c0 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
302d0 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
302e0 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
302f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30300 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
30310 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
30320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30330 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30340 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
30350 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
30360 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
30370 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
30380 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
30390 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
303a0 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73  gs);..open_finis
303b0 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  hed:.  if( rc!=S
303c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
303d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
303e0 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20  pUnused);.  }.  
303f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
30400 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
30410 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49  file at zPath. I
30420 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72  f the dirSync ar
30430 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
30440 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64  fsync().** the d
30450 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
30460 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
30470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30480 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71  unixDelete(.  sq
30490 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
304a0 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63  ed,     /* VFS c
304b0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61  ontaining this a
304c0 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65  s the xDelete me
304d0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
304e0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
304f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
30500 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
30510 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79  d */.  int dirSy
30520 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
30530 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79   /* If true, fsy
30540 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61  nc() directory a
30550 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69  fter deleting fi
30560 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
30570 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30580 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30590 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
305a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
305b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
305c0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28  R_DELETE);.  if(
305d0 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29   osUnlink(zPath)
305e0 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66  ==(-1) ){.    if
305f0 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  ( errno==ENOENT 
30600 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
30610 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
30620 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  E_NOENT;.    }el
30630 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  se{.      rc = u
30640 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
30650 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
30660 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68   "unlink", zPath
30670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
30680 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e  urn rc;.  }.#ifn
30690 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
306a0 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28  LE_DIRSYNC.  if(
306b0 20 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d   (dirSync & 1)!=
306c0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  0 ){.    int fd;
306d0 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
306e0 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
306f0 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72   &fd);.    if( r
30700 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30710 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
30720 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
30730 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20  d)==-1 ).#else. 
30740 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
30750 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  d) ).#endif.    
30760 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d    {.        rc =
30770 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
30780 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
30790 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a  SYNC, "fsync", z
307a0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
307b0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
307c0 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
307d0 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  _);.    }else if
307e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
307f0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
30800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30810 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
30820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30830 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
30840 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61  xistence of or a
30850 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
30860 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
30870 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
30880 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
30890 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
308a0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
308b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
308c0 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
308d0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
308e0 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
308f0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
30900 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
30910 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
30920 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
30930 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
30940 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
30950 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
30960 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
30970 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
30980 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
30990 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
309a0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
309b0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
309c0 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
309d0 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
309e0 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
309f0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
30a00 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
30a10 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
30a20 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
30a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30a40 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
30a50 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
30a60 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
30a70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
30a80 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
30a90 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
30aa0 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
30ab0 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30  .  int amode = 0
30ac0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
30ad0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30ae0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
30af0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
30b00 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
30b10 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
30b20 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
30b30 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
30b40 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  S:.      amode =
30b50 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   F_OK;.      bre
30b60 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
30b70 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
30b80 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64  RITE:.      amod
30b90 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20  e = W_OK|R_OK;. 
30ba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30bb0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30bc0 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61  SS_READ:.      a
30bd0 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20  mode = R_OK;.   
30be0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
30bf0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
30c00 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
30c10 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
30c20 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
30c30 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74  = (osAccess(zPat
30c40 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
30c50 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
30c60 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
30c70 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a   && *pResOut ){.
30c80 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
30c90 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  buf;.    if( 0==
30ca0 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
30cb0 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
30cc0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
30cd0 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
30ce0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
30cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
30d00 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
30d10 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
30d20 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
30d30 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
30d40 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
30d50 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
30d60 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
30d70 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
30d80 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
30d90 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
30da0 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
30db0 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
30dc0 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
30dd0 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
30de0 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
30df0 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
30e00 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
30e10 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
30e20 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
30e30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
30e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
30e50 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
30e60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
30e70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
30e80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
30e90 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
30ea0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
30eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30ec0 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
30ed0 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
30ee0 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f00 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
30f10 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
30f20 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
30f30 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
30f40 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
30f50 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
30f60 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
30f70 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
30f80 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
30f90 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
30fa0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
30fb0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
30fc0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
30fd0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
30fe0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
30ff0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
31000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
31010 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
31020 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
31030 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
31040 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
31050 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
31060 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
31070 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
31080 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
31090 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
310a0 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
310b0 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
310c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
310d0 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
310e0 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
310f0 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
31100 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
31110 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
31120 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
31130 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
31140 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
31150 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
31160 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
31170 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
31180 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
31190 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
311a0 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
311b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
311c0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
311d0 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
311e0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
311f0 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
31200 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
31210 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
31220 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
31230 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31240 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
31250 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
31260 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
31270 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
31280 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
31290 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
312a0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
312b0 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
312c0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
312d0 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
312e0 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
312f0 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
31300 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31310 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
31320 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
31330 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31340 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
31350 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
31360 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
31370 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
31380 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
31390 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
313a0 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
313b0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
313c0 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
313d0 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
313e0 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
313f0 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
31400 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
31410 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
31420 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
31430 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
31440 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
31450 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
31460 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
31470 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
31480 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
31490 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
314a0 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
314b0 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
314c0 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
314d0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
314e0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
314f0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
31500 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
31510 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
31520 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31530 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
31540 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
31550 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
31560 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
31570 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
31580 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
31590 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
315a0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
315b0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
315c0 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
315d0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
315e0 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
315f0 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
31600 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
31610 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
31620 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
31630 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
31640 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
31650 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
31660 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
31670 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
31680 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
31690 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
316a0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
316b0 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
316c0 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
316d0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
316e0 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
316f0 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
31700 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
31710 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
31720 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
31730 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
31740 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31750 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
31760 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
31770 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
31780 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
31790 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
317a0 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
317b0 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
317c0 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
317d0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
317e0 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
317f0 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
31800 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
31810 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
31820 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
31830 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
31840 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
31850 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
31860 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
31870 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
31880 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
31890 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
318a0 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
318b0 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
318c0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
318d0 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
318e0 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
318f0 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
31900 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
31910 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
31920 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
31930 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
31940 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
31950 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
31960 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
31970 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
31980 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
31990 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
319a0 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
319b0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
319c0 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
319d0 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
319e0 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
319f0 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
31a00 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
31a10 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
31a20 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
31a30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
31a40 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
31a50 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
31a60 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
31a70 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
31a80 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
31a90 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
31aa0 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
31ab0 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
31ac0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31ad0 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
31ae0 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
31af0 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
31b00 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
31b10 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
31b20 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
31b30 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
31b40 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
31b50 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
31b60 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31b70 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
31b80 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
31b90 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
31ba0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
31bb0 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
31bc0 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
31bd0 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
31be0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
31bf0 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
31c00 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
31c10 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
31c20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
31c30 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
31c40 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
31c50 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
31c60 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
31c70 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
31c80 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
31c90 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
31ca0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
31cb0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
31cc0 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
31cd0 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
31ce0 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
31cf0 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
31d00 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
31d10 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
31d20 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
31d30 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
31d40 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
31d50 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
31d60 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
31d70 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
31d80 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
31d90 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
31da0 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
31db0 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
31dc0 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
31dd0 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
31de0 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
31df0 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
31e00 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
31e10 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
31e20 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
31e30 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
31e40 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
31e50 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
31e60 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
31e70 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
31e80 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
31e90 2c 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66  , fd, got;.    f
31ea0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
31eb0 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
31ec0 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  O_RDONLY, 0);.  
31ed0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
31ee0 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
31ef0 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20      time(&t);.  
31f00 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
31f10 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
31f20 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74  .      pid = get
31f30 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d  pid();.      mem
31f40 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
31f50 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  (t)], &pid, size
31f60 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20  of(pid));.      
31f70 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74  assert( sizeof(t
31f80 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28  )+sizeof(pid)<=(
31f90 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
31fa0 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
31fb0 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70  of(t) + sizeof(p
31fc0 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
31fd0 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20        do{ got = 
31fe0 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  osRead(fd, zBuf,
31ff0 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
32000 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
32010 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72  EINTR );.      r
32020 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66  obust_close(0, f
32030 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
32040 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
32050 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a   return nBuf;.}.
32060 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
32070 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
32080 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
32090 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
320a0 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  pt..** The argum
320b0 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ent is the numbe
320c0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
320d0 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65  s we want to sle
320e0 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ep..** The retur
320f0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
32100 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
32110 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61  conds of sleep a
32120 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65  ctually.** reque
32130 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  sted from the un
32140 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
32150 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d  ng system, a num
32160 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  ber which.** mig
32170 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ht be greater th
32180 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
32190 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74  he argument, but
321a0 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61   not less.** tha
321b0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
321c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
321d0 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  ixSleep(sqlite3_
321e0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
321f0 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b  t microseconds){
32200 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
32210 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
32220 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73  c sp;..  sp.tv_s
32230 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64  ec = microsecond
32240 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73  s / 1000000;.  s
32250 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63  p.tv_nsec = (mic
32260 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30  roseconds % 1000
32270 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e  000) * 1000;.  n
32280 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55  anosleep(&sp, NU
32290 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  LL);.  UNUSED_PA
322a0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
322b0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
322c0 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64  seconds;.#elif d
322d0 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
322e0 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
322f0 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
32300 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  oseconds);.  UNU
32310 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32320 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
32330 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
32340 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e  else.  int secon
32350 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ds = (microsecon
32360 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30  ds+999999)/10000
32370 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f  00;.  sleep(seco
32380 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
32390 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
323a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
323b0 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
323c0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
323d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
323e0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
323f0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
32400 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
32410 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
32420 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
32430 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
32440 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
32450 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
32460 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
32470 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
32480 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
32490 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
324a0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
324b0 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
324c0 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
324d0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
324e0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
324f0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
32500 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
32510 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
32520 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
32530 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
32540 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
32550 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
32560 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
32570 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
32580 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
32590 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
325a0 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
325b0 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
325c0 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
325d0 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
325e0 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
325f0 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
32600 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
32610 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
32620 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
32630 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
32640 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
32650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32660 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
32670 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
32680 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
32690 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
326a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
326b0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
326c0 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
326d0 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65  *NotUsed, sqlite
326e0 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
326f0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
32700 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
32710 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
32720 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
32730 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74  4)8640000;.  int
32740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32750 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
32760 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
32770 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
32780 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
32790 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30  ite3_int64)t)*10
327a0 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
327b0 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
327c0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
327d0 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
327e0 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
327f0 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
32800 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
32810 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
32820 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
32830 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
32840 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
32850 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
32860 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69  imeval sNow;.  i
32870 66 28 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  f( gettimeofday(
32880 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a  &sNow, 0)==0 ){.
32890 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69      *piNow = uni
328a0 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
328b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
328c0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
328d0 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 20 20  tv_usec/1000;.  
328e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
328f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
32900 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
32910 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
32920 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
32930 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
32940 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
32950 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
32960 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
32970 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
32980 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
32990 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
329a0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sed);.  return r
329b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
329c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
329d0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
329e0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
329f0 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
32a00 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
32a10 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
32a20 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
32a30 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
32a40 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
32a50 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
32a60 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
32a70 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
32a80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
32a90 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
32aa0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
32ab0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
32ac0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
32ad0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
32ae0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32af0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32b00 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54  c = unixCurrentT
32b10 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b  imeInt64(0, &i);
32b20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36  .  *prNow = i/86
32b30 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75  400000.0;.  retu
32b40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
32b50 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
32b60 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
32b70 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
32b80 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
32b90 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
32ba0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
32bb0 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
32bc0 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
32bd0 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
32be0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
32bf0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
32c00 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
32c10 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
32c20 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
32c30 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
32c40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
32c50 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
32c60 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
32c70 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
32c80 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
32c90 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
32ca0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
32cb0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
32cc0 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
32cd0 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
32ce0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32cf0 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
32d00 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32d10 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
32d20 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
32d30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
32d40 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
32d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
32d60 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
32d70 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
32d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32d90 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
32da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32de0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
32df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e30 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
32e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e50 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
32e60 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
32e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32e80 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
32e90 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
32ea0 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
32eb0 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
32ec0 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
32ed0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
32ee0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
32ef0 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
32f00 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
32f10 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
32f20 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
32f30 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
32f40 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
32f50 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
32f60 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
32f70 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
32f80 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
32f90 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
32fa0 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
32fb0 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
32fc0 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
32fd0 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
32fe0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
32ff0 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
33000 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
33010 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
33020 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
33030 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
33040 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
33050 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
33060 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
33070 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
33080 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
33090 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
330a0 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
330b0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
330c0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
330d0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
330e0 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
330f0 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
33100 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
33110 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
33120 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
33130 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
33140 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
33150 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
33160 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
33170 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
33180 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
33190 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
331a0 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
331b0 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
331c0 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
331d0 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
331e0 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
331f0 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
33200 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
33210 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
33220 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
33230 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
33240 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
33250 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
33260 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
33270 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
33280 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
33290 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
332a0 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
332b0 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
332c0 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
332d0 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
332e0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
332f0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
33300 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
33310 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
33320 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
33330 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
33340 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
33350 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
33360 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
33370 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
33380 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
33390 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
333a0 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
333b0 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
333c0 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
333d0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
333e0 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
333f0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
33400 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
33410 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
33420 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
33430 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
33440 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
33450 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
33460 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
33470 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
33480 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
33490 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
334a0 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
334b0 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
334c0 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
334d0 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
334e0 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
334f0 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
33500 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
33510 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
33520 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
33530 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
33540 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
33550 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
33560 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
33570 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
33580 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
33590 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
335a0 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
335b0 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
335c0 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
335d0 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
335e0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
335f0 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
33600 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
33610 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
33620 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
33630 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
33640 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
33650 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
33660 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
33670 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
33680 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
33690 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
336a0 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
336b0 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
336c0 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
336d0 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
336e0 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
336f0 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
33700 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
33710 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
33720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33730 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
33740 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
33750 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
33760 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
33770 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
33780 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
33790 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
337a0 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
337b0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
337c0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
337d0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
337e0 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
337f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
33800 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
33810 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
33820 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
33830 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
33840 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
33850 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70  YFILE, &<proxy_p
33860 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ath>);.**.**.** 
33870 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a  SQL pragmas.**.*
33880 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
33890 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
338a0 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68  file=<proxy_path
338b0 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50  > | :auto:.**  P
338c0 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
338d0 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
338e0 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e  .**.** Specifyin
338f0 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73  g ":auto:" means
33900 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
33910 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  s a conch file w
33920 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
33930 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c  * host ID in it,
33940 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20   the proxy path 
33950 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
33960 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  e will be used, 
33970 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70  otherwise.** a p
33980 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20  roxy path based 
33990 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65  on the user's te
339a0 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63  mp dir.** (via c
339b0 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
339c0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
339d0 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73  ...)) will be us
339e0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63  ed and the.** ac
339f0 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20  tual proxy file 
33a00 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65  name is generate
33a10 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20  d from the name 
33a20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a  and path of the.
33a30 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
33a40 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
33a50 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20  **.**       For 
33a60 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f  database path "/
33a70 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22  Users/me/foo.db"
33a80 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c   .**       The l
33a90 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
33aa0 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74   "<tmpdir>/sqlit
33ab0 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d  eplocks/_Users_m
33ac0 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29  e_foo.db:auto:")
33ad0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f  .**.** Once a lo
33ae0 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66  ck proxy is conf
33af0 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74  igured for a dat
33b00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
33b10 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20  , it can not.** 
33b20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65  be removed, howe
33b30 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77  ver it may be sw
33b40 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66  itched to a diff
33b50 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68  erent proxy path
33b60 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76   via.** the abov
33b70 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67  e APIs (assuming
33b80 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
33b90 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c  is not being hel
33ba0 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  d by another.** 
33bb0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72  connection or pr
33bc0 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a  ocess). .**.**.*
33bd0 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b  * How proxy lock
33be0 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d  ing works.** ---
33bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c00 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ----.**.** Proxy
33c10 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65   file locking re
33c20 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f  lies primarily o
33c30 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72  n two new suppor
33c40 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a  ting files: .**.
33c50 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69  **   *  conch fi
33c60 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65  le to limit acce
33c70 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
33c80 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e  se file to a sin
33c90 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20  gle host.**     
33ca0 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   at a time.**.**
33cb0 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65     *  proxy file
33cc0 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f   to act as a pro
33cd0 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73  xy for the advis
33ce0 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c  ory locks normal
33cf0 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e  ly.**      taken
33d00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33d10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68  .**.** The conch
33d20 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61   file - to use a
33d30 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c   proxy file, sql
33d40 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22  ite must first "
33d50 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a  hold the conch".
33d60 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20  ** by taking an 
33d70 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61  sqlite-style sha
33d80 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
33d90 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64  conch file, read
33da0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
33db0 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e  nts and comparin
33dc0 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69  g the host's uni
33dd0 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65  que host ID (see
33de0 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b   below) and lock
33df0 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61  .** proxy path a
33e00 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65  gainst the value
33e10 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
33e20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63  conch.  The conc
33e30 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f  h file is.** sto
33e40 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
33e50 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
33e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
33e70 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  nd the file name
33e80 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64  .** is patterned
33e90 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
33ea0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ase file name as
33eb0 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65   ".<databasename
33ec0 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20  >-conch"..** If 
33ed0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  the conch file d
33ee0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
33ef0 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20  r it's contents 
33f00 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
33f10 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
33f20 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
33f30 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
33f40 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
33f50 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
33f60 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
33f70 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
33f80 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
33f90 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
33fa0 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
33fb0 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
33fc0 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
33fd0 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
33fe0 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
33ff0 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
34000 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
34010 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
34020 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
34030 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
34040 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
34050 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
34060 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
34070 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
34080 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
34090 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
340a0 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
340b0 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
340c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
340d0 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
340e0 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
340f0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
34100 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
34110 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
34120 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
34130 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
34140 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
34150 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
34160 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
34170 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
34180 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
34190 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
341a0 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
341b0 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
341c0 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
341d0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
341e0 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
341f0 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
34200 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
34210 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
34220 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
34230 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
34240 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
34250 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
34260 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
34270 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
34280 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
34290 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
342a0 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
342b0 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
342c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
342d0 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
342e0 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
342f0 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
34300 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
34310 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
34320 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
34330 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
34340 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
34350 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
34360 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
34370 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
34380 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
34390 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
343a0 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
343b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
343c0 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
343d0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
343e0 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
343f0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
34400 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
34410 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
34420 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
34430 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
34440 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
34450 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
34460 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
34470 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
34480 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
34490 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
344a0 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
344b0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
344c0 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
344d0 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
344e0 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
344f0 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
34500 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
34510 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
34520 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
34530 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
34540 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
34550 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
34560 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
34570 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
34580 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
34590 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
345a0 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
345b0 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
345c0 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
345d0 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
345e0 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
345f0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
34600 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
34610 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
34620 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
34630 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
34640 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
34650 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
34660 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
34670 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
34680 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
34690 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
346a0 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
346b0 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
346c0 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
346d0 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
346e0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
346f0 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
34700 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
34710 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
34720 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
34730 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
34740 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
34750 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
34760 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
34770 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
34780 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
34790 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
347a0 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
347b0 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
347c0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
347d0 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69  (explicity calli
347e0 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45  ng the SQLITE_SE
347f0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
34800 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c  pragma or.** sql
34810 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ite_file_control
34820 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65   API is not affe
34830 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46  cted by SQLITE_F
34840 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
34850 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  NG)..*/../*.** P
34860 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
34870 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
34880 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66  n MacOSX .*/.#if
34890 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
348a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
348b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
348c0 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  LE../*.** The pr
348d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
348e0 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61  t has the path a
348f0 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  nd file structur
34900 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74  es for the remot
34910 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20  e .** and local 
34920 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69  proxy files in i
34930 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
34940 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
34950 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63  Context proxyLoc
34960 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
34970 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
34980 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78  Context {.  unix
34990 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
349a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
349b0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
349c0 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65   char *conchFile
349d0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
349e0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
349f0 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ch file */.  uni
34a00 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
34a10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
34a20 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  n proxy lock fil
34a30 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
34a40 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20  kProxyPath;     
34a50 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
34a60 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
34a70 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62  le */.  char *db
34a80 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
34a90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
34aa0 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
34ab0 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64  .  int conchHeld
34ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34ad0 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63  /* 1 if the conc
34ae0 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66  h is held, -1 if
34af0 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76   lockless */.  v
34b00 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43  oid *oldLockingC
34b10 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f  ontext;     /* O
34b20 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63  riginal lockingc
34b30 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72  ontext to restor
34b40 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  e on close */.  
34b50 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
34b60 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65  ds const *pOldMe
34b70 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69  thod;     /* Ori
34b80 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64  ginal I/O method
34b90 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d  s for close */.}
34ba0 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72  ;../* .** The pr
34bb0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  oxy lock file pa
34bc0 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  th for the datab
34bd0 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73  ase at dbPath is
34be0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50   written into lP
34bf0 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d  ath, .** which m
34c00 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c  ust point to val
34c10 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d  id, writable mem
34c20 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ory large enough
34c30 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65   for a maxLen le
34c40 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74  ngth.** file pat
34c50 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h. .*/.static in
34c60 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
34c70 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
34c80 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
34c90 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
34ca0 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
34cb0 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
34cc0 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
34cd0 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
34ce0 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
34cf0 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
34d00 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
34d10 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
34d20 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
34d30 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66   {.    if( !conf
34d40 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
34d50 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
34d60 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a  ath, maxLen) ){.
34d70 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
34d80 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69  GETLOCKPATH  fai
34d90 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20  led %s errno=%d 
34da0 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
34db0 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c            lPath,
34dc0 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29   errno, getpid()
34dd0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
34de0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
34df0 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  CK;.    }.    le
34e00 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
34e10 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73  h, "sqliteplocks
34e20 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a  ", maxLen);    .
34e30 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
34e40 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
34e50 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
34e60 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
34e70 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
34e80 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
34e90 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
34ea0 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
34eb0 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
34ec0 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
34ed0 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
34ee0 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
34ef0 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
34f00 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
34f10 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
34f20 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
34f30 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69  )<(int)maxLen; i
34f40 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  ++){.    char c 
34f50 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  = dbPath[i];.   
34f60 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20   lPath[i+len] = 
34f70 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a  (c=='/')?'_':c;.
34f80 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65    }.  lPath[i+le
34f90 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63  n]='\0';.  strlc
34fa0 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f  at(lPath, ":auto
34fb0 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f  :", maxLen);.  O
34fc0 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
34fd0 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
34fe0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
34ff0 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69  n", lPath, getpi
35000 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
35010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
35020 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
35030 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
35040 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
35050 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
35060 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
35070 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
35080 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
35090 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
350a0 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
350b0 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
350c0 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
350d0 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
350e0 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
350f0 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
35100 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
35110 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
35120 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
35130 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
35140 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
35150 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
35160 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
35170 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
35180 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
35190 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
351a0 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
351b0 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
351c0 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
351d0 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
351e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
351f0 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
35200 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
35210 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
35220 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
35230 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
35240 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
35250 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
35260 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
35270 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
35280 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
35290 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
352a0 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
352b0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
352c0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
352d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
352e0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
352f0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
35300 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
35310 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
35320 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
35330 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
35340 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
35350 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
35360 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
35370 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
35380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35390 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
353a0 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
353b0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
353c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
353d0 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
353e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
353f0 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
35400 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
35410 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
35420 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
35430 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
35440 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
35450 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
35460 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
35470 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
35480 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
35490 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
354a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
354b0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
354c0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
354d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
354e0 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
354f0 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
35500 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
35510 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
35520 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
35530 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
35540 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
35550 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
35560 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
35570 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
35580 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
35590 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
355a0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
355b0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
355c0 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
355d0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
355e0 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
355f0 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
35600 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
35610 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
35620 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
35630 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
35640 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
35650 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
35660 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
35670 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
35680 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
35690 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
356a0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
356b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
356c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
356d0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
356e0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
356f0 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
35700 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
35710 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
35720 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
35730 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
35740 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
35750 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
35760 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
35770 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
35780 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
35790 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
357a0 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
357b0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
357c0 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
357d0 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
357e0 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
357f0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
35800 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
35810 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
35820 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
35830 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
35840 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
35850 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
35860 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
35870 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
35880 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
35890 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
358a0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
358b0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
358c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
358d0 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
358e0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
358f0 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66  Unused));.    if
35900 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
35910 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35920 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
35930 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
35940 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
35950 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
35960 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
35970 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
35980 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
35990 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
359a0 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
359b0 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
359c0 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
359d0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
359e0 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
359f0 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
35a00 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a   openFlags, 0);.
35a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35a20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
35a30 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
35a40 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
35a50 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
35a60 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
35a70 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  0);.    terrno =
35a80 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
35a90 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
35aa0 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
35ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35ac0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
35ad0 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
35ae0 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
35af0 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
35b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
35b10 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
35b20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
35b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
35b40 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
35b50 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
35b60 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
35b70 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
35b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35b90 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
35ba0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
35bb0 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
35bc0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
35bd0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
35be0 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
35bf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
35c00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
35c10 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
35c20 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
35c30 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
35c40 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
35c50 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
35c60 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d  = openFlags;.  m
35c70 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c  emset(&dummyVfs,
35c80 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
35c90 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66  Vfs));.  dummyVf
35ca0 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
35cb0 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
35cc0 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66  inder;.  dummyVf
35cd0 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79  s.zName = "dummy
35ce0 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64  ";.  pUnused->fd
35cf0 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64   = fd;.  pUnused
35d00 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  ->flags = openFl
35d10 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e  ags;.  pNew->pUn
35d20 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
35d30 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
35d40 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56  UnixFile(&dummyV
35d50 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33  fs, fd, (sqlite3
35d60 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
35d70 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  h, 0);.  if( rc=
35d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35d90 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
35da0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
35db0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f  ITE_OK;.  }.end_
35dc0 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20  create_proxy:   
35dd0 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65   .  robust_close
35de0 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e  (pNew, fd, __LIN
35df0 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E__);.  sqlite3_
35e00 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71  free(pNew);.  sq
35e10 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
35e20 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
35e30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
35e40 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c  TE_TEST./* simul
35e50 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
35e60 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
35e70 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
35e80 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
35e90 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
35ea0 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
35eb0 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
35ec0 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
35ed0 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
35ee0 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f   id length */../
35ef0 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66  * Not always def
35f00 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
35f10 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20  ers as it ought 
35f20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20  to be */.extern 
35f30 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28  int gethostuuid(
35f40 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74  uuid_t id, const
35f50 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
35f60 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74   *wait);../* get
35f70 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61   the host ID via
35f80 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20   gethostuuid(), 
35f90 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69  pHostID must poi
35fa0 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54  nt to PROXY_HOST
35fb0 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20  IDLEN .** bytes 
35fc0 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f  of writable memo
35fd0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
35fe0 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  t proxyGetHostID
35ff0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
36000 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45  pHostID, int *pE
36010 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rror){.  assert(
36020 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
36030 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74  == sizeof(uuid_t
36040 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f  ));.  memset(pHo
36050 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48  stID, 0, PROXY_H
36060 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64  OSTIDLEN);.#if d
36070 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f  efined(__MAX_OS_
36080 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
36090 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20  QUIRED)\.       
360a0 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43          && __MAC
360b0 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
360c0 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a  N_REQUIRED<1050.
360d0 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63    {.    static c
360e0 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
360f0 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b  spec timeout = {
36100 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20  1, 0}; /* 1 sec 
36110 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69  timeout */.    i
36120 66 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70  f( gethostuuid(p
36130 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74  HostID, &timeout
36140 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ) ){.      int e
36150 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
36160 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
36170 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20          *pError 
36180 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  = err;.      }. 
36190 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
361a0 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
361b0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
361c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72  ED_PARAMETER(pEr
361d0 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ror);.#endif.#if
361e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
361f0 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75    /* simulate mu
36200 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
36210 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
36220 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
36230 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  s */.  if( sqlit
36240 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d  e3_hostid_num !=
36250 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44   0){.    pHostID
36260 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f  [0] = (char)(pHo
36270 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29  stID[0] + (char)
36280 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  (sqlite3_hostid_
36290 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20  num & 0xFF));.  
362a0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65  }.#endif.  .  re
362b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
362c0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20  }../* The conch 
362d0 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
362e0 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69  e header, host i
362f0 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  d and lock file 
36300 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  path. */.#define
36310 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53   PROXY_CONCHVERS
36320 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74  ION 2   /* 1-byt
36330 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74  e header, 16-byt
36340 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20  e host id, path 
36350 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
36360 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20  _HEADERLEN    1 
36370 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
36380 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f  header length */
36390 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50  .#define PROXY_P
363a0 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f  ATHINDEX    (PRO
363b0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
363c0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64  XY_HOSTIDLEN).#d
363d0 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43  efine PROXY_MAXC
363e0 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f  ONCHLEN  (PROXY_
363f0 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
36400 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54  HOSTIDLEN+MAXPAT
36410 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61  HLEN)../* .** Ta
36420 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63  kes an open conc
36430 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74  h file, copies t
36440 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61  he contents to a
36450 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68   new path and th
36460 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20  en moves .** it 
36470 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79  back.  The newly
36480 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20   created file's 
36490 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
364a0 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  is assigned to t
364b0 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65  he.** conch file
364c0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66   structure and f
364d0 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69  inally the origi
364e0 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  nal conch file d
364f0 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a  escriptor is .**
36500 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e   closed.  Return
36510 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73  s zero if succes
36520 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sful..*/.static 
36530 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f  int proxyBreakCo
36540 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
36550 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
36560 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f  myHostID){.  pro
36570 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36580 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
36590 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
365a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
365b0 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
365c0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
365d0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
365e0 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41  .  char tPath[MA
365f0 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  XPATHLEN];.  cha
36600 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  r buf[PROXY_MAXC
36610 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  ONCHLEN];.  char
36620 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e   *cPath = pCtx->
36630 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20  conchFilePath;. 
36640 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20   size_t readLen 
36650 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61  = 0;.  size_t pa
36660 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  thLen = 0;.  cha
36670 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22  r errmsg[64] = "
36680 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  ";.  int fd = -1
36690 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b  ;.  int rc = -1;
366a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
366b0 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a  TER(myHostID);..
366c0 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
366d0 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
366e0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
366f0 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
36700 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
36710 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
36720 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
36730 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
36740 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
36750 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
36760 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
36770 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
36780 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
36790 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  = 5) ){.    sqli
367a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
367b0 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
367c0 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28  sg,"path error (
367d0 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61  len %d)",(int)pa
367e0 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  thLen);.    goto
367f0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
36800 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68    }.  /* read th
36810 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20  e conch content 
36820 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f  */.  readLen = o
36830 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65  sPread(conchFile
36840 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f  ->h, buf, PROXY_
36850 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
36860 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50  .  if( readLen<P
36870 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29  ROXY_PATHINDEX )
36880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
36890 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
368a0 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65  rmsg),errmsg,"re
368b0 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  ad error (len %d
368c0 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29  )",(int)readLen)
368d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
368e0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
368f0 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  /* write it out 
36900 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
36910 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20   break file */. 
36920 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
36930 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52  n(tPath, (O_RDWR
36940 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29  |O_CREAT|O_EXCL)
36950 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  , 0);.  if( fd<0
36960 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
36970 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36980 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
36990 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20   "create failed 
369a0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
369b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
369c0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
369d0 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62 75   osPwrite(fd, bu
369e0 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21  f, readLen, 0) !
369f0 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c  = (ssize_t)readL
36a00 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
36a10 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
36a20 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
36a30 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64  g, "write failed
36a40 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
36a50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
36a60 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
36a70 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20  ( rename(tPath, 
36a80 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71  cPath) ){.    sq
36a90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
36aa0 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
36ab0 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66  rrmsg, "rename f
36ac0 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
36ad0 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
36ae0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
36af0 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72  .  rc = 0;.  fpr
36b00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72  intf(stderr, "br
36b10 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  oke stale lock o
36b20 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b  n %s\n", cPath);
36b30 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
36b40 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65  pFile, conchFile
36b50 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
36b60 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d    conchFile->h =
36b70 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65   fd;.  conchFile
36b80 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  ->openFlags = O_
36b90 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
36ba0 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a  .end_breaklock:.
36bb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36bc0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
36bd0 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74     osUnlink(tPat
36be0 68 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  h);.      robust
36bf0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64  _close(pFile, fd
36c00 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
36c10 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   }.    fprintf(s
36c20 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74  tderr, "failed t
36c30 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f  o break stale lo
36c40 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c  ck on %s, %s\n",
36c50 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b   cPath, errmsg);
36c60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36c70 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65  ;.}../* Take the
36c80 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
36c90 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
36ca0 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74  e and break a st
36cb0 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  ale lock if the 
36cc0 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63  .** host id matc
36cd0 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hes..*/.static i
36ce0 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63  nt proxyConchLoc
36cf0 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
36d00 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
36d10 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  ID, int lockType
36d20 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
36d30 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
36d40 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
36d50 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
36d60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
36d70 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
36d80 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
36d90 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  nchFile;.  int r
36da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36db0 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b   int nTries = 0;
36dc0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
36dd0 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b  ec conchModTime;
36de0 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  .  .  memset(&co
36df0 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73  nchModTime, 0, s
36e00 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69  izeof(conchModTi
36e10 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  me));.  do {.   
36e20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
36e30 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
36e40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
36e50 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
36e60 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20  pe);.    nTries 
36e70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ++;.    if( rc==
36e80 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
36e90 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c       /* If the l
36ea0 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79  ock failed (busy
36eb0 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20  ):.       * 1st 
36ec0 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64  try: get the mod
36ed0 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   time of the con
36ee0 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e  ch, wait 0.5s an
36ef0 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20  d try again. .  
36f00 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20       * 2nd try: 
36f10 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20  fail if the mod 
36f20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20  time changed or 
36f30 68 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65  host id is diffe
36f40 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20  rent, wait .    
36f50 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31     *           1
36f60 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67  0 sec and try ag
36f70 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64  ain.       * 3rd
36f80 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20   try: break the 
36f90 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20  lock unless the 
36fa0 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61  mod time has cha
36fb0 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  nged..       */.
36fc0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
36fd0 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28  t buf;.      if(
36fe0 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69   osFstat(conchFi
36ff0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
37000 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
37010 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
37020 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
37030 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37040 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
37050 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37060 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ies==1 ){.      
37070 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d    conchModTime =
37080 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
37090 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65  c;.        uslee
370a0 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  p(500000); /* wa
370b0 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74  it 0.5 sec and t
370c0 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
370d0 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  n*/.        cont
370e0 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a  inue;  .      }.
370f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
37100 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20  Tries>1 );.     
37110 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
37120 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
37130 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
37140 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
37150 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
37160 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
37170 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
37180 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
37190 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
371a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
371b0 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
371c0 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20  ==2 ){  .       
371d0 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59   char tBuf[PROXY
371e0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
371f0 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
37200 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
37210 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f  le->h, tBuf, PRO
37220 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
37230 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
37240 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  len<0 ){.       
37250 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
37260 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
37270 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37280 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
37290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
372a0 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59     if( len>PROXY
372b0 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42  _PATHINDEX && tB
372c0 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f  uf[0]==(char)PRO
372d0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29  XY_CONCHVERSION)
372e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
372f0 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
37300 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20  ock if the host 
37310 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  id doesn't match
37320 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
37330 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75  ( 0!=memcmp(&tBu
37340 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
37350 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
37360 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29  OXY_HOSTIDLEN) )
37370 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
37380 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
37390 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
373a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
373b0 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
373c0 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f  break the lock o
373d0 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20  n short read or 
373e0 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74  a version mismat
373f0 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
37400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
37410 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SY;.        }.  
37420 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30        usleep(100
37430 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
37440 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  10 sec and try t
37450 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f  he lock again */
37460 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
37470 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e; .      }.    
37480 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
37490 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20   nTries==3 );.  
374a0 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79      if( 0==proxy
374b0 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70  BreakConchLock(p
374c0 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20  File, myHostID) 
374d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
374e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
374f0 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
37500 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
37510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
37520 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
37530 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
37540 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
37550 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43  File, SHARED_LOC
37560 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20  K);          .  
37570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37580 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
37590 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
375a0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
375b0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
375c0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
375d0 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20  ckType);.       
375e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
375f0 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d  .  } while( rc==
37600 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e  SQLITE_BUSY && n
37610 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20  Tries<3 );.  .  
37620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37630 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68   Takes the conch
37640 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61   by taking a sha
37650 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61  red lock and rea
37660 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63  d the contents c
37670 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63  onch, if .** loc
37680 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c  kPath is non-NUL
37690 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  L, the host ID a
376a0 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
376b0 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41  h must match.  A
376c0 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61   NULL .** lockPa
376d0 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  th means that th
376e0 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68  e lockPath in th
376f0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
37700 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  l be used if the
37710 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61   .** host IDs ma
37720 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f  tch, or a new lo
37730 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
37740 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
37750 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20  tically .** and 
37760 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
37770 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  onch file..*/.st
37780 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61  atic int proxyTa
37790 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  keConch(unixFile
377a0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78   *pFile){.  prox
377b0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
377c0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
377d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
377e0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
377f0 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20  text; .  .  if( 
37800 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21  pCtx->conchHeld!
37810 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
37820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
37830 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
37840 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
37850 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
37860 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73      uuid_t myHos
37870 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72  tID;.    int pEr
37880 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ror = 0;.    cha
37890 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  r readBuf[PROXY_
378a0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
378b0 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b    char lockPath[
378c0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
378d0 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50   char *tempLockP
378e0 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ath = NULL;.    
378f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37900 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61  OK;.    int crea
37910 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20  teConch = 0;.   
37920 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68   int hostIdMatch
37930 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
37940 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69  adLen = 0;.    i
37950 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  nt tryOldLockPat
37960 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  h = 0;.    int f
37970 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
37980 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53  = 0;.    .    OS
37990 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43  TRACE(("TAKECONC
379a0 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  H  %d for %s pid
379b0 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c  =%d\n", conchFil
379c0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
379d0 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
379e0 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
379f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
37a00 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69  ":auto:"), getpi
37a10 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d  d()));..    rc =
37a20 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
37a30 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f  myHostID, &pErro
37a40 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  r);.    if( (rc&
37a50 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
37a60 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ERR ){.      pFi
37a70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
37a80 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f  pError;.      go
37a90 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
37aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
37ab0 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
37ac0 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c  pFile, myHostID,
37ad0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
37ae0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37af0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
37b00 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
37b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72  ;.    }.    /* r
37b20 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  ead the existing
37b30 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
37b40 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65     readLen = see
37b50 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
37b60 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30  le*)conchFile, 0
37b70 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59  , readBuf, PROXY
37b80 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20  _MAXCONCHLEN);. 
37b90 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30     if( readLen<0
37ba0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f   ){.      /* I/O
37bb0 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e   error: lastErrn
37bc0 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
37bd0 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46  Read */.      pF
37be0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
37bf0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74   conchFile->last
37c00 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
37c10 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
37c20 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  EAD;.      goto 
37c30 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
37c40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61     }else if( rea
37c50 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41  dLen<=(PROXY_HEA
37c60 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
37c70 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20  TIDLEN) || .    
37c80 20 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66           readBuf
37c90 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59  [0]!=(char)PROXY
37ca0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b  _CONCHVERSION ){
37cb0 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72  .      /* a shor
37cc0 74 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f  t read or versio
37cd0 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63  n format mismatc
37ce0 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  h means we need 
37cf0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
37d00 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20  .      ** conch 
37d10 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  file. .      */.
37d20 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63        createConc
37d30 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  h = 1;.    }.   
37d40 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20   /* if the host 
37d50 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74  id matches and t
37d60 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72  he lock path alr
37d70 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74  eady exists in t
37d80 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20  he conch.    ** 
37d90 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65  we'll try to use
37da0 20 74 68 65 20 70 61 74 68 20 74 68 65 72 65 2c   the path there,
37db0 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65   if we can't ope
37dc0 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77 65 27  n that path, we'
37dd0 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79  ll .    ** retry
37de0 20 77 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f   with a new auto
37df0 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74 68 20  -generated path 
37e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
37e10 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
37e20 65 65 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e  eed to try again
37e30 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e   for an :auto: n
37e40 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  amed lock file *
37e50 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63 72  /..      if( !cr
37e60 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f  eateConch && !fo
37e70 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29  rceNewLockPath )
37e80 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 64  {.        hostId
37e90 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28  Match = !memcmp(
37ea0 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48  &readBuf[PROXY_H
37eb0 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
37ec0 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tID, .          
37ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ee0 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f          PROXY_HO
37ef0 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20  STIDLEN);.      
37f00 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
37f10 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61  h has data compa
37f20 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
37f30 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
37f40 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
37f50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
37f60 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d   /* for auto-nam
37f70 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  ed local lock fi
37f80 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74  le, just check t
37f90 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77  he host ID and w
37fa0 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20  e'll.           
37fb0 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c  ** use the local
37fc0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
37fd0 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69  that's already i
37fe0 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  n there.        
37ff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
38000 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
38010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
38020 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
38030 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59  (readLen - PROXY
38040 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20  _PATHINDEX);.   
38050 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
38060 20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c 65        if( pathLe
38070 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b  n>=MAXPATHLEN ){
38080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
38090 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45  athLen=MAXPATHLE
380a0 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  N-1;.           
380b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
380c0 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20  emcpy(lockPath, 
380d0 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50  &readBuf[PROXY_P
380e0 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c  ATHINDEX], pathL
380f0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
38100 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65   lockPath[pathLe
38110 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
38120 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68      tempLockPath
38130 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20   = lockPath;.   
38140 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
38150 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20  ockPath = 1;.   
38160 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61           /* crea
38170 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
38180 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68   lock path if th
38190 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e  e conch is taken
381a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
381b0 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
381c0 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ch;.          }.
381d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
381e0 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20  ( hostIdMatch.  
381f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
38200 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c  !strncmp(pCtx->l
38210 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72  ockProxyPath, &r
38220 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54  eadBuf[PROXY_PAT
38230 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20  HINDEX],.       
38240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38250 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58      readLen-PROX
38260 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20  Y_PATHINDEX).   
38270 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
38280 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20    /* conch host 
38290 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61  and lock path ma
382a0 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
382b0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
382c0 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  nch; .        }.
382d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
382e0 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63       /* if the c
382f0 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74 61  onch isn't writa
38300 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20  ble and doesn't 
38310 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20  match, we can't 
38320 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  take it */.     
38330 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d   if( (conchFile-
38340 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57  >openFlags&O_RDW
38350 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20  R) == 0 ){.     
38360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
38370 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  USY;.        got
38380 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
38390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
383a0 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20        /* either 
383b0 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74  the conch didn't
383c0 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65   match or we nee
383d0 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
383e0 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  w one */.      i
383f0 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
38400 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
38410 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50     proxyGetLockP
38420 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ath(pCtx->dbPath
38430 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  , lockPath, MAXP
38440 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
38450 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20   tempLockPath = 
38460 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
38470 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
38480 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
38490 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68  ath _only_ if th
384a0 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e  e conch is taken
384b0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
384c0 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61    .      /* upda
384d0 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f  te conch with ho
384e0 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69  st and path (thi
384f0 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f  s will fail if o
38500 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20  ther process.   
38510 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72     ** has a shar
38520 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29  ed lock already)
38530 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  , if the host id
38540 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74 68   matches, use th
38550 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73  e big.      ** s
38560 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tick..      */. 
38570 20 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e       futimes(con
38580 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29  chFile->h, NULL)
38590 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73 74  ;.      if( host
385a0 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65 61  IdMatch && !crea
385b0 7