/ Hex Artifact Content
Login

Artifact 9270957b8ebab7a6c930cc6891f98cf396771d9d:


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 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2490: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
24a0: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
24b0: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
24c0: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
24d0: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
24e0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
24f0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
2500: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2510: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
2520: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
2530: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2540: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2550: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2560: 69 6e 74 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  int randomnessPi
2570: 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c  d = 0;../*.** Al
2580: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72  lowed values for
2590: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74   the unixFile.ct
25a0: 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a  rlFlags bitmask:
25b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
25c0: 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20  FILE_EXCL       
25d0: 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e   0x01     /* Con
25e0: 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e  nections from on
25f0: 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a  e process only *
2600: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2610: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30  LE_RDONLY      0
2620: 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x02     /* Conne
2630: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
2640: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
2650: 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
2660: 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50  AL 0x04     /* P
2670: 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f  ersistent WAL mo
2680: 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  de */.#ifndef SQ
2690: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
26a0: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e  SYNC.# define UN
26b0: 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20  IXFILE_DIRSYNC  
26c0: 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69    0x08     /* Di
26d0: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65  rectory sync nee
26e0: 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64  ded */.#else.# d
26f0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
2700: 49 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23  IRSYNC    0x00.#
2710: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e  endif.#define UN
2720: 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  IXFILE_PSOW     
2730: 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53     0x10     /* S
2740: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
2750: 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
2760: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2770: 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20  ILE_DELETE      
2780: 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65  0x20     /* Dele
2790: 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23  te on close */.#
27a0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
27b0: 55 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30  URI         0x40
27c0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
27d0: 20 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72   might have quer
27e0: 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  y parameters */.
27f0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2800: 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38  _NOLOCK      0x8
2810: 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66  0     /* Do no f
2820: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23  ile locking */.#
2830: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2840: 57 41 52 4e 45 44 20 20 20 20 30 78 30 31 30 30  WARNED    0x0100
2850: 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79 44 62       /* verifyDb
2860: 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67 73 20  File() warnings 
2870: 68 61 76 65 20 62 65 65 6e 20 69 73 73 75 65 64  have been issued
2880: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
2890: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
28a0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
28b0: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
28c0: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
28d0: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  n.h"../*.** Defi
28e0: 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f  ne various macro
28f0: 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69  s that are missi
2900: 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73  ng from some sys
2910: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
2920: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
2930: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
2940: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  E 0.#endif.#ifde
2950: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2960: 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c  _LFS.# undef O_L
2970: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
2980: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
2990: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
29a0: 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69  _NOFOLLOW.# defi
29b0: 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a  ne O_NOFOLLOW 0.
29c0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f  #endif.#ifndef O
29d0: 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65  _BINARY.# define
29e0: 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64   O_BINARY 0.#end
29f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
2a00: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
2a10: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2a20: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2a30: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2a40: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2a50: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
2a60: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2a70: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
2a80: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
2a90: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
2aa0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
2ab0: 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52  f../*.** HAVE_MR
2ac0: 45 4d 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f  EMAP defaults to
2ad0: 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61   true on Linux a
2ae0: 6e 64 20 66 61 6c 73 65 20 65 76 65 72 79 77 68  nd false everywh
2af0: 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66  ere else..*/.#if
2b00: 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d   !defined(HAVE_M
2b10: 52 45 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69  REMAP).# if defi
2b20: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
2b30: 26 20 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53  & defined(_GNU_S
2b40: 4f 55 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65  OURCE).#  define
2b50: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23   HAVE_MREMAP 1.#
2b60: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
2b70: 48 41 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20  HAVE_MREMAP 0.# 
2b80: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
2b90: 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e  .** Different Un
2ba0: 69 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61  ix systems decla
2bb0: 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66  re open() in dif
2bc0: 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61  ferent ways.  Sa
2bd0: 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63  me use.** open(c
2be0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d  onst char*,int,m
2bf0: 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20  ode_t).  Others 
2c00: 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  use open(const c
2c10: 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a  har*,int,...)..*
2c20: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
2c30: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68   is important wh
2c40: 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74  en using a point
2c50: 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  er to the functi
2c60: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  on..**.** The sa
2c70: 66 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c  fest way to deal
2c80: 20 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65   with the proble
2c90: 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75  m is to always u
2ca0: 73 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a  se this wrapper.
2cb0: 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ** which always 
2cc0: 68 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c  has the same wel
2cd0: 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66  l-defined interf
2ce0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
2cf0: 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e  nt posixOpen(con
2d00: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
2d10: 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d  int flags, int m
2d20: 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  ode){.  return o
2d30: 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73  pen(zFile, flags
2d40: 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , mode);.}../*.*
2d50: 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  * On some system
2d60: 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f  s, calls to fcho
2d70: 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65  wn() will trigge
2d80: 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61  r a message in a
2d90: 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67   security.** log
2da0: 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72   if they come fr
2db0: 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63  om non-root proc
2dc0: 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64  esses.  So avoid
2dd0: 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28   calling fchown(
2de0: 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e  ) if.** we are n
2df0: 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  ot running as ro
2e00: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
2e10: 74 20 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e  t posixFchown(in
2e20: 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c  t fd, uid_t uid,
2e30: 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72   gid_t gid){.  r
2e40: 65 74 75 72 6e 20 67 65 74 65 75 69 64 28 29 20  eturn geteuid() 
2e50: 3f 20 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c  ? 0 : fchown(fd,
2e60: 75 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20  uid,gid);.}../* 
2e70: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
2e80: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
2e90: 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
2ea0: 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29  nst char*, int*)
2eb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79  ;../*.** Many sy
2ec0: 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61  stem calls are a
2ed0: 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20  ccessed through 
2ee0: 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74  pointer-to-funct
2ef0: 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20  ions so that.** 
2f00: 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72  they may be over
2f10: 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d  ridden at runtim
2f20: 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  e to facilitate 
2f30: 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20  fault injection 
2f40: 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e  during.** testin
2f50: 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67  g and sandboxing
2f60: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2f70: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65   array holds the
2f80: 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74   names and point
2f90: 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76  ers.** to all ov
2fa0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
2fb0: 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  m calls..*/.stat
2fc0: 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73  ic struct unix_s
2fd0: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
2fe0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3000: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3010: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3020: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
3030: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
3040: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
3050: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
3060: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3070: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
3080: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
3090: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
30a0: 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20   {.  { "open",  
30b0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
30c0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
30d0: 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64  xOpen,  0  },.#d
30e0: 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20  efine osOpen    
30f0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3100: 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29   char*,int,int))
3110: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
3120: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73  rent)..  { "clos
3130: 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  e",        (sqli
3140: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3150: 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d  close,      0  }
3160: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ,.#define osClos
3170: 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  e     ((int(*)(i
3180: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e  nt))aSyscall[1].
3190: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
31a0: 61 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28  access",       (
31b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
31c0: 70 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20  ptr)access,     
31d0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
31e0: 41 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28  Access    ((int(
31f0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3200: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  nt))aSyscall[2].
3210: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3220: 67 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28  getcwd",       (
3230: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3240: 70 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20  ptr)getcwd,     
3250: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3260: 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72  Getcwd    ((char
3270: 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f  *(*)(char*,size_
3280: 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  t))aSyscall[3].p
3290: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73  Current)..  { "s
32a0: 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73  tat",         (s
32b0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32c0: 74 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30  tr)stat,       0
32d0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53    },.#define osS
32e0: 74 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a  tat      ((int(*
32f0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74  )(const char*,st
3300: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
3310: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
3320: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47  )../*.** The DJG
3330: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69  PP compiler envi
3340: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f  ronment looks mo
3350: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20  stly like Unix, 
3360: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20  but it.** lacks 
3370: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  the fcntl() syst
3380: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64  em call.  So red
3390: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f  efine fcntl() to
33a0: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   be something.**
33b0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63   that always suc
33c0: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61  ceeds.  This mea
33d0: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20  ns that locking 
33e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
33f0: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20  nder.** DJGPP.  
3400: 42 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20  But it is DOS - 
3410: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
3420: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
3430: 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73  _DJGPP__.  { "fs
3440: 74 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20  tat",        0, 
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3470: 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20  Fstat(a,b,c)    
3480: 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b  0.#else     .  {
3490: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
34a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
34b0: 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20  l_ptr)fstat,    
34c0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
34d0: 6f 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e  osFstat     ((in
34e0: 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20  t(*)(int,struct 
34f0: 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  stat*))aSyscall[
3500: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
3510: 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63  dif..  { "ftrunc
3520: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3530: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74  3_syscall_ptr)ft
3540: 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a  runcate,  0  },.
3550: 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63  #define osFtrunc
3560: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
3570: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
3580: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [6].pCurrent).. 
3590: 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20   { "fcntl",     
35a0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
35b0: 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20  all_ptr)fcntl,  
35c0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
35d0: 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28  e osFcntl     ((
35e0: 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e  int(*)(int,int,.
35f0: 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  ..))aSyscall[7].
3600: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3610: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28  read",         (
3620: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3630: 70 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20  ptr)read,       
3640: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3650: 52 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a  Read      ((ssiz
3660: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
3670: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3680: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
3690: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
36a0: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
36b0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
36c0: 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64  STYLE.  { "pread
36d0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
36e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
36f0: 72 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c  read,      0  },
3700: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
3710: 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  d",        (sqli
3720: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3730: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3740: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3750: 20 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73   osPread     ((s
3760: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3770: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3780: 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43  ))aSyscall[9].pC
3790: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
37a0: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
37b0: 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  ).  { "pread64",
37c0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
37d0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
37e0: 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  64,    0  },.#el
37f0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22  se.  { "pread64"
3800: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3810: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3820: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3830: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3840: 72 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65  read64   ((ssize
3850: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3860: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3870: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
3880: 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65  ent)..  { "write
3890: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
38a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77  e3_syscall_ptr)w
38b0: 72 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  rite,      0  },
38c0: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
38d0: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
38e0: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
38f0: 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61  *,size_t))aSysca
3900: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
3910: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3920: 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49  E_PREAD) || SQLI
3930: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
3940: 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72  G_STYLE.  { "pwr
3950: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3960: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3970: 29 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20  )pwrite,     0  
3980: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77  },.#else.  { "pw
3990: 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71  rite",       (sq
39a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
39b0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
39c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
39d0: 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28  ne osPwrite    (
39e0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
39f0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
3a00: 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20  _t,off_t))\.    
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75  aSyscall[12].pCu
3a30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3a40: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
3a50: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3a60: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3a70: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
3a80: 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  64,   0  },.#els
3a90: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22  e.  { "pwrite64"
3aa0: 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ,     (sqlite3_s
3ab0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3ac0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3ad0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3ae0: 72 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f  rite64  ((ssize_
3af0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3b00: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3b10: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
3b20: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
3b30: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
3b40: 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20  .  { "fchmod",  
3b50: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3b60: 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64  scall_ptr)fchmod
3b70: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
3b80: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3b90: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3ba0: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3bb0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3bc0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3bd0: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3be0: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3bf0: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3c00: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3c10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3c20: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
3c30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3c40: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
3c50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3c60: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3c70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3c80: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3c90: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3ca0: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3cb0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3cc0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3cd0: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3cf0: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3d00: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3d10: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
3d20: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3d30: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
3d40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3d50: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
3d60: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3d70: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3d80: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3d90: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3da0: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3db0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3dc0: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3dd0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3de0: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
3df0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3e00: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
3e10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
3e20: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
3e30: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
3e40: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
3e50: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
3e60: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
3e70: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3e80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
3e90: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
3ea0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
3eb0: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
3ec0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3ed0: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3ee0: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77  ent)..  { "fchow
3ef0: 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  n",       (sqlit
3f00: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3f10: 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20  osixFchown,     
3f20: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46  0 },.#define osF
3f30: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
3f40: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
3f50: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
3f60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3f70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f80: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
3f90: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
3fa0: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
3fb0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3fc0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
3fd0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3fe0: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
3ff0: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
4000: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
4010: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  t))aSyscall[21].
4020: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4030: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
4040: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4050: 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20  ptr)munmap,     
4060: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
4070: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69  e osMunmap ((voi
4080: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
4090: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  _t))aSyscall[22]
40a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
40b0: 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20  HAVE_MREMAP.  { 
40c0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
40d0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
40e0: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
40f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4100: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
4110: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
4120: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
4130: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4140: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4150: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
4160: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
4170: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
4180: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
4190: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 7d  rrent).#endif..}
41a0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
41b0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
41c0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
41d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
41e0: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
41f0: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4200: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4210: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
4220: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
4230: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
4240: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
4250: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
4260: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
4270: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
4280: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
4290: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
42a0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
42b0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
42c0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
42d0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
42e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
42f0: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4300: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4310: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
4320: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4340: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
4350: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
4360: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
4370: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
4380: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
4390: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
43a0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
43b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
43c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
43d0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
43e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
43f0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4400: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4410: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4420: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4430: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4440: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4450: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4460: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4470: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
4480: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4490: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
44a0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
44b0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
44c0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
44d0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
44e0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
44f0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4500: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4510: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4520: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4530: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4540: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4550: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4560: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4570: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
4580: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
4590: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
45a0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
45b0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
45c0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
45d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
45e0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
45f0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4600: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4610: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4620: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4630: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4640: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4650: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4670: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4680: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
4690: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
46a0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
46b0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
46c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
46d0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
46e0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
46f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4700: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4710: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4720: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4730: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4740: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4750: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4760: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4770: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
4780: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
4790: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
47a0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
47b0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
47d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
47e0: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
47f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4800: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4810: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4820: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4830: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4840: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4850: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4860: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4870: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4880: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
4890: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
48a0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
48b0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
48c0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
48d0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
48e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
48f0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
4900: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
4910: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
4920: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
4930: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
4940: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
4950: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
4960: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4970: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
4980: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
4990: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
49a0: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
49b0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
49c0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
49d0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
49e0: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
49f0: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
4a00: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
4a10: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
4a20: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
4a30: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
4a40: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
4a50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4a60: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
4a70: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
4a80: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4a90: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4aa0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
4ab0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4ac0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
4ad0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
4ae0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
4af0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4b00: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
4b10: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4b20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
4b40: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
4b50: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
4b60: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
4b70: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
4b80: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
4b90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
4ba0: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
4bb0: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
4bc0: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
4bd0: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
4be0: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
4bf0: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
4c00: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
4c10: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
4c20: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
4c30: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
4c40: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
4c50: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
4c60: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
4c70: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
4c80: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
4c90: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
4ca0: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
4cb0: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
4cc0: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
4cd0: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
4ce0: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
4cf0: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
4d00: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
4d10: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
4d20: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
4d30: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
4d40: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
4d50: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
4d60: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
4d70: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
4d80: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
4d90: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
4da0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
4db0: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
4dc0: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
4dd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
4de0: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
4df0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
4e00: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
4e10: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
4e20: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
4e30: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
4e40: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
4e50: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
4e60: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
4e70: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
4e80: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
4e90: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
4ea0: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
4eb0: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
4ec0: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
4ed0: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
4ee0: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
4ef0: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
4f00: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
4f10: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
4f20: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
4f30: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
4f40: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
4f50: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
4f60: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
4f70: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
4f80: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
4f90: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
4fa0: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
4fb0: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
4fc0: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
4fd0: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
4fe0: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
4ff0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
5000: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
5010: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
5020: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
5030: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
5040: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
5050: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
5060: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
5070: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
5080: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
5090: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
50a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
50b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
50c0: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
50d0: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
50e0: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
50f0: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5100: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5110: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
5120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5130: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
5140: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
5150: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
5160: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
5170: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
5180: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
5190: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
51a0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
51b0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
51c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
51d0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
51e0: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
51f0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5200: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5210: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
5220: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
5230: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
5240: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
5250: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
5260: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
5270: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
5280: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
5290: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
52a0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
52b0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
52c0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
52d0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
52e0: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
52f0: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5300: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5310: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5320: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5330: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5340: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5350: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5360: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
5370: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
5380: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
5390: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
53a0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
53b0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
53c0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
53d0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
53e0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
53f0: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5400: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5410: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5420: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5430: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5440: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5450: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5460: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5470: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
5480: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
5490: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
54a0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
54b0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
54c0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
54d0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
54e0: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
54f0: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5500: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5510: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5520: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5530: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5540: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
5550: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
5560: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
5570: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
5580: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
5590: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
55a0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
55b0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
55c0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
55d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
55e0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
55f0: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
5600: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5610: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
5620: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
5630: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
5640: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
5650: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5660: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
5670: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5680: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5690: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
56a0: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
56b0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
56c0: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
56d0: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
56e0: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
56f0: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
5700: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5710: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5720: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5730: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
5740: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
5750: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
5760: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
5770: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
5780: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
5790: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
57a0: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
57b0: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
57c0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
57d0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
57e0: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
57f0: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5800: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
5810: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
5820: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
5830: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
5840: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
5850: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5860: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
5870: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
5880: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
5890: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
58a0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
58b0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
58c0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
58d0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
58e0: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
58f0: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
5900: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
5910: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
5920: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
5930: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
5940: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
5950: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
5960: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
5970: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
5980: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
5990: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
59a0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
59b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
59c0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
59d0: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
59e0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
59f0: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
5a00: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
5a10: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5a20: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5a30: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
5a40: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
5a50: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5a60: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
5a70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5a80: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
5a90: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
5aa0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
5ab0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
5ac0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
5ad0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5ae0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
5af0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
5b00: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
5b10: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5b20: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5b30: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
5b40: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5b50: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
5b60: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
5b70: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
5b80: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
5b90: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
5ba0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5bb0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
5bc0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
5bd0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5be0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
5bf0: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
5c00: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
5c10: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
5c20: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
5c30: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
5c40: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
5c50: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
5c60: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
5c70: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
5c80: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
5c90: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
5ca0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
5cb0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
5cc0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
5cd0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
5ce0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
5cf0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5d00: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
5d10: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
5d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5d30: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
5d40: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5d50: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
5d60: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5d70: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5d80: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5d90: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
5da0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5db0: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
5dc0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5dd0: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
5de0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
5df0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
5e00: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
5e10: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
5e20: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
5e30: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
5e40: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
5e50: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
5e60: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
5e70: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
5e80: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
5e90: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
5ea0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
5eb0: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
5ec0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
5ed0: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
5ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
5ef0: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
5f00: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
5f10: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
5f20: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
5f30: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
5f40: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
5f50: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
5f60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5f70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5f80: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
5f90: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
5fa0: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
5fb0: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
5fc0: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
5fd0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
5fe0: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
5ff0: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
6000: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
6010: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
6020: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
6030: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
6040: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
6050: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
6060: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
6070: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6080: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
6090: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
60a0: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
60b0: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
60c0: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
60d0: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
60e0: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
60f0: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
6100: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
6110: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
6120: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
6130: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
6140: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
6150: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
6160: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
6170: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
6180: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
6190: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
61a0: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
61b0: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
61c0: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
61d0: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
61e0: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
61f0: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
6200: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
6210: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
6220: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
6230: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
6240: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
6250: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
6260: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
6270: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
6280: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
6290: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
62a0: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
62b0: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
62c0: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
62d0: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
62e0: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
62f0: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
6300: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
6310: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
6320: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
6330: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
6340: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
6350: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
6360: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
6370: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
6380: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
6390: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
63a0: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
63b0: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
63c0: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
63d0: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
63e0: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
63f0: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
6400: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
6410: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
6420: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
6430: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
6440: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
6450: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
6460: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
6470: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
6480: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
6490: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
64a0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
64b0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
64c0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
64d0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
64e0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
64f0: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
6500: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6510: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
6520: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
6530: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
6540: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
6550: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
6560: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
6570: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
6580: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6590: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
65a0: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
65b0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
65c0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
65d0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c  || .        (sql
65e0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
65f0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
6600: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c   ||.        (sql
6610: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6620: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
6630: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
6640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6650: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
6660: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
6670: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
6680: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
6690: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
66a0: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41  ;.    .  /* EDEA
66b0: 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DLK is only poss
66c0: 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74  ible if a call t
66d0: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57  o fcntl(F_SETLKW
66e0: 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20  ) is made. And. 
66f0: 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   ** this module 
6700: 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68  never makes such
6710: 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65   a call. And the
6720: 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20   code in SQLite 
6730: 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73  itself .  ** ass
6740: 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45  erts that SQLITE
6750: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69  _IOERR_BLOCKED i
6760: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64  s never returned
6770: 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73  . For these reas
6780: 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  ons.  ** this ca
6790: 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  se is also comme
67a0: 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65  nted out. If the
67b0: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74   system does set
67c0: 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c   errno to EDEADL
67d0: 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61  K,.  ** the defa
67e0: 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ult SQLITE_IOERR
67f0: 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62  _XXX code will b
6800: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23  e returned. */.#
6810: 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41  if 0.  case EDEA
6820: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
6830: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
6840: 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20  CKED;.#endif.   
6850: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
6860: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
6870: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
6880: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
6890: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
68a0: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
68b0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
68c0: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
68d0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
68e0: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
68f0: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
6900: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
6910: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
6920: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
6930: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
6940: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6950: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6960: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
6970: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
6980: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
6990: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
69a0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
69b0: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
69c0: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
69d0: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
69e0: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
69f0: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
6a00: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
6a10: 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20  :.#ifdef ESTALE 
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a30: 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73      /* ESTALE is
6a40: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20   not defined on 
6a50: 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20  Interix systems 
6a60: 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  */.  case ESTALE
6a70: 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  :.#endif.  case 
6a80: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
6a90: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
6aa0: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
6ab0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
6ac0: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
6ad0: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
6ae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
6af0: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
6b00: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b50: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6b60: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
6b70: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
6b80: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
6b90: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
6ba0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
6bb0: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
6bc0: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
6bd0: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
6be0: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
6bf0: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
6c00: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
6c10: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
6c20: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
6c30: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
6c40: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
6c50: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
6c60: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
6c70: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
6c80: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
6c90: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
6ca0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6cb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6cc0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
6cd0: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
6ce0: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
6cf0: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
6d00: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
6d10: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
6d20: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
6d30: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
6d40: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
6d50: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
6d60: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
6d70: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
6d80: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
6d90: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6da0: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
6db0: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
6dc0: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
6dd0: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
6de0: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
6df0: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
6e00: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
6e10: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
6e20: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
6e30: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
6e40: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
6e50: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
6e60: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
6e70: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
6e80: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6e90: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
6ea0: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
6eb0: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
6ec0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
6ef0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
6f00: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
6f10: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
6f20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6f30: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
6f40: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
6f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
6f60: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
6f70: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
6f80: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
6f90: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6fa0: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
6fb0: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
6fc0: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
6fd0: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
6fe0: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
6ff0: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
7000: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7010: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
7020: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
7030: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
7040: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
7050: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
7060: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
7070: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
7080: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
7090: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
70a0: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
70b0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
70c0: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
70d0: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
70e0: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
70f0: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
7100: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
7110: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
7120: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
7130: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
7140: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
7150: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
7160: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
7170: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
7180: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
7190: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
71a0: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
71b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
71c0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
71d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
71e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
71f0: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
7200: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
7210: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
7220: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
7230: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
7240: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
7250: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
7260: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
7270: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
7280: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
7290: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
72a0: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
72b0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
72c0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
72d0: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
72e0: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
72f0: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
7300: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
7310: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
7320: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
7330: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
7340: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
7350: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
7360: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7370: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
7380: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
7390: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
73a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
73b0: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
73c0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
73d0: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
73e0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
73f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
7400: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7410: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
7420: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
7430: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
7440: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
7450: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
7460: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
7470: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
7480: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
7490: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
74a0: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
74b0: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
74c0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
74d0: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
74e0: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
74f0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
7500: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7510: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
7520: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
7530: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
7540: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
7550: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
7560: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
7570: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
7580: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7590: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
75a0: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
75b0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
75c0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
75d0: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
75e0: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
75f0: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
7600: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
7610: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
7640: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
7650: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
7660: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
7670: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
7680: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
7690: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
76a0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
76b0: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
76c0: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
76d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
76e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
76f0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7700: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
7710: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
7720: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7730: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
7740: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
7750: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
7760: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
7770: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
7780: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
7790: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
77a0: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
77b0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
77c0: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
77d0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
77e0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
77f0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
7800: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
7810: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
7820: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
7830: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
7840: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
7850: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
7860: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
7870: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
7880: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
7890: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
78a0: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
78b0: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
78c0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
78d0: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
78e0: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
78f0: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
7900: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
7910: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
7920: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
7930: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
7940: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
7950: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
7960: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
7970: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
7980: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
7990: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
79a0: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
79b0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
79c0: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
79d0: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
79e0: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
79f0: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
7a00: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7a10: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
7a20: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
7a30: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7a40: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
7a50: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
7a60: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
7a70: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
7a80: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7a90: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
7aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7ab0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
7ac0: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
7ad0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
7ae0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7af0: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
7b00: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
7b10: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
7b20: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
7b30: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
7b40: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
7b50: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
7b60: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
7b70: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
7b80: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
7b90: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
7ba0: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
7bb0: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
7bc0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
7bd0: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
7be0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7bf0: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
7c00: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
7c20: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
7c30: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
7c40: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
7cb0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
7d20: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
7d30: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
7d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d50: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
7d60: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
7d70: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
7d80: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
7d90: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
7da0: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
7db0: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
7dc0: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
7dd0: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
7de0: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
7df0: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
7e00: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
7e10: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
7e20: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
7e30: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
7e40: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
7e50: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
7e60: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
7e70: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
7e80: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
7e90: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7ea0: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
7eb0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
7ec0: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
7ed0: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
7ee0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
7ef0: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
7f00: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
7f10: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7f20: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
7f30: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
7f40: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
7f50: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
7f60: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
7f70: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
7f80: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
7f90: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
7fa0: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
7fb0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
7fc0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
7fd0: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
7fe0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7ff0: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
8000: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
8010: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
8020: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
8030: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
8040: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
8050: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
8060: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
8070: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
8080: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
8090: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
80a0: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
80b0: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
80c0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
80d0: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
80e0: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
80f0: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
8100: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
8110: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
8120: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8130: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
8140: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
8150: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
8160: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
8170: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
8180: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
8190: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
81a0: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
81b0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
81c0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
81d0: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
81e0: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
81f0: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
8200: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
8210: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
8220: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
8230: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
8240: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
8250: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
8260: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
8270: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
8280: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
8290: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
82a0: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
82b0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
82c0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
82d0: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
82e0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
82f0: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
8300: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
8310: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
8320: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
8330: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
8340: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
8350: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
8360: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
8370: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
8380: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
8390: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
83a0: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
83b0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
83c0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
83d0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
83e0: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
83f0: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
8400: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
8410: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
8420: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
8430: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
8440: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
8450: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
8460: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
8470: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
8480: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
8490: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
84a0: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
84b0: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
84c0: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
84d0: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
84e0: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
84f0: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
8500: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
8510: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
8520: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
8530: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
8540: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
8550: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
8560: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
8570: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8580: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
8590: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
85a0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
85b0: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
85c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
85d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
85e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
85f0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
8600: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
8610: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
8620: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
8630: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
8640: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
8650: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
8660: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
8670: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
8680: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
8690: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
86a0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
86b0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
86c0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
86d0: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
86e0: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
86f0: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
8700: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
8710: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
8720: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
8730: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
8740: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
8750: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
8760: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
8770: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
8780: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
8790: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
87a0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
87b0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
87c0: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
87d0: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
87e0: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
87f0: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
8800: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
8810: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
8820: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
8830: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
8840: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
8850: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
8860: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
8870: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
8880: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
8890: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
88a0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
88b0: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
88c0: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
88d0: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
88e0: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
88f0: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
8900: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
8910: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
8920: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
8930: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
8940: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
8950: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
8960: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
8970: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
8980: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
8990: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
89a0: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
89b0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
89c0: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
89d0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
89e0: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
89f0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
8a00: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
8a10: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
8a20: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
8a30: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
8a40: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
8a50: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
8a60: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
8a70: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
8a80: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
8a90: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
8aa0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
8ab0: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
8ac0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8ad0: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
8ae0: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
8af0: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
8b00: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
8b10: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
8b20: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
8b30: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
8b40: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
8b50: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
8b60: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
8b70: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
8b80: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
8b90: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
8ba0: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
8bb0: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
8bc0: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
8bd0: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
8be0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
8bf0: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
8c00: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
8c10: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
8c20: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
8c30: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
8c40: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
8c50: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
8c60: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
8c70: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
8c80: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
8c90: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
8ca0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
8cb0: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
8cc0: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
8cd0: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
8ce0: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
8cf0: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
8d00: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
8d10: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
8d20: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
8d30: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
8d40: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
8d50: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
8d60: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
8d70: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
8d80: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
8d90: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
8da0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
8db0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
8dc0: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
8dd0: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
8de0: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
8df0: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
8e00: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
8e10: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
8e20: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
8e30: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
8e40: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
8e50: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
8e60: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
8e70: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
8e80: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
8e90: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
8ea0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
8eb0: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
8ec0: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
8ed0: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
8ee0: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
8ef0: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
8f00: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
8f10: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
8f20: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
8f30: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
8f40: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
8f50: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
8f60: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
8f70: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
8f80: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
8f90: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
8fa0: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
8fb0: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
8fc0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
8fd0: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
8fe0: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
8ff0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
9000: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
9010: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
9020: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
9030: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
9040: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
9050: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
9060: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
9070: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
9080: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
9090: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
90a0: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
90b0: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
90c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
90d0: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
90e0: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
90f0: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
9100: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
9110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9120: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
9130: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
9140: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9150: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
9160: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
9170: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
9180: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
9190: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
91a0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
91b0: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
91c0: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
91d0: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
91e0: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
91f0: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
9200: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
9210: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9220: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
9230: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
9240: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
9250: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
9260: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
9270: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
9280: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
9290: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
92a0: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
92b0: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
92c0: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
92d0: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
92e0: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
92f0: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
9300: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
9310: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
9340: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
9350: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9360: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
9370: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
9380: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
9390: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
93a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
93b0: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
93c0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
93d0: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
93e0: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
93f0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9410: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
9420: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
9430: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
9440: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
9450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
9460: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
9470: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
9480: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
9490: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
94b0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
94c0: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
94d0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
94e0: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
94f0: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
9500: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
9510: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
9520: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
9530: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
9540: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
9550: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9560: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
9570: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
9580: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
9590: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
95a0: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
95b0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
95c0: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
95d0: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
95e0: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
95f0: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
9600: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
9610: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9620: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
9650: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
9660: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
9670: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
9680: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
9690: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
96a0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
96b0: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
96c0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
96d0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
96e0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
96f0: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
9700: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9710: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
9720: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
9730: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
9740: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
9750: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
9760: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
9770: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
9780: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
9790: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
97a0: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
97b0: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
97c0: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
97d0: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
97e0: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
97f0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
9800: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
9810: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
9820: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
9830: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
9840: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
9850: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
9860: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
9870: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
9880: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
9890: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
98a0: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
98b0: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
98c0: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
98d0: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
98e0: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
98f0: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
9900: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
9910: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
9920: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
9930: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
9940: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
9950: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
9960: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
9970: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
9980: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
9990: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
99a0: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
99b0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
99c0: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
99d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
99e0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
99f0: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
9a20: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
9a30: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9a50: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
9a60: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
9a70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9a80: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
9a90: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
9aa0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9ab0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
9ac0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9ae0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
9af0: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
9b00: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
9b10: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b30: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
9b40: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
9b50: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
9b60: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b80: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
9b90: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
9ba0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
9bb0: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
9bc0: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
9bd0: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
9be0: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
9bf0: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
9c00: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
9c10: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
9c20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
9c30: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
9c40: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
9c50: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
9c60: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
9c70: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9c80: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
9c90: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
9ca0: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
9cb0: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
9cc0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
9cd0: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
9ce0: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
9cf0: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
9d00: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
9d10: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
9d20: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
9d30: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
9d40: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
9d50: 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  s the GNU versio
9d60: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
9d70: 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75  ) that.  ** retu
9d80: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
9d90: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
9da0: 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  ning the error m
9db0: 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69  essage. That poi
9dc0: 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70  nter .  ** may p
9dd0: 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20  oint to aErr[], 
9de0: 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20  or it may point 
9df0: 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73  to some static s
9e00: 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65  torage somewhere
9e10: 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
9e20: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
9e30: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
9e40: 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  es the POSIX ver
9e50: 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74  sion of .  ** st
9e60: 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63  rerror_r(), whic
9e70: 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20  h always writes 
9e80: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9e90: 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20   into aErr[]..  
9ea0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  **.  ** If the c
9eb0: 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  ode incorrectly 
9ec0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
9ed0: 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  is the POSIX ver
9ee0: 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a  sion that is.  *
9ef0: 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  * available, the
9f00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
9f10: 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20  ill often be an 
9f20: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f  empty string. No
9f30: 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72  t a.  ** huge pr
9f40: 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74  oblem. Incorrect
9f50: 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68  ly concluding th
9f60: 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  at the GNU versi
9f70: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  on is available 
9f80: 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64  .  ** could lead
9f90: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74   to a segfault t
9fa0: 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20  hough..  */.#if 
9fb0: 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52  defined(STRERROR
9fc0: 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65  _R_CHAR_P) || de
9fd0: 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29  fined(__USE_GNU)
9fe0: 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64  .  zErr = .# end
9ff0: 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28  if.  strerror_r(
a000: 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69  iErrno, aErr, si
a010: 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a  zeof(aErr)-1);..
a020: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52  #elif SQLITE_THR
a030: 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69  EADSAFE.  /* Thi
a040: 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66  s is a threadsaf
a050: 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72  e build, but str
a060: 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74  error_r() is not
a070: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20   available. */. 
a080: 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73   zErr = "";.#els
a090: 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61  e.  /* Non-threa
a0a0: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65  dsafe build, use
a0b0: 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a   strerror(). */.
a0c0: 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f    zErr = strerro
a0d0: 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69  r(iErrno);.#endi
a0e0: 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  f..  if( zPath==
a0f0: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
a100: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72    sqlite3_log(er
a110: 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73  rcode,.      "os
a120: 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29  _unix.c:%d: (%d)
a130: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
a140: 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72       iLine, iErr
a150: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
a160: 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72  , zErr.  );..  r
a170: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
a180: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
a190: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
a1a0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
a1b0: 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c   that close() al
a1c0: 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b  most always work
a1d0: 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f  s, since it is o
a1e0: 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79  nly in a.** very
a1f0: 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f   sick applicatio
a200: 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73  n or on a very s
a210: 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61  ick platform tha
a220: 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e  t it might fail.
a230: 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66  .** If it does f
a240: 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b  ail, simply leak
a250: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
a260: 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67  ptor, but do log
a270: 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a   the.** error..*
a280: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
a290: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
a2a0: 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61   retry close() a
a2b0: 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65  fter EINTR since
a2c0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
a2d0: 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61  criptor might ha
a2e0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
a2f0: 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65  reused by anothe
a300: 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20  r thread..** So 
a310: 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72  we don't even tr
a320: 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  y to recover fro
a330: 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73  m an EINTR.  Jus
a340: 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a  t log the error.
a350: 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a  ** and move on..
a360: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a370: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78  obust_close(unix
a380: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
a390: 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b   h, int lineno){
a3a0: 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68  .  if( osClose(h
a3b0: 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  ) ){.    unixLog
a3c0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49  ErrorAtLine(SQLI
a3d0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
a3e0: 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20  "close",.       
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a  pFile ? pFile->z
a410: 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f  Path : 0, lineno
a420: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a430: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
a440: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
a450: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
a460: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
a470: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
a480: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
a490: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
a4a0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a4b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a4c0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a4d0: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
a4e0: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
a4f0: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
a500: 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70   for(p=pInode->p
a510: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
a520: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
a530: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72   p->pNext;.    r
a540: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
a550: 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45  e, p->fd, __LINE
a560: 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  __);.    sqlite3
a570: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
a580: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
a590: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
a5a0: 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64  lease a unixInod
a5b0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
a5c0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
a5d0: 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64  ated by findInod
a5e0: 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  eInfo()..**.** T
a5f0: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
a600: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
a610: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
a620: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
a630: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
a640: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a650: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a660: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
a670: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
a680: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
a690: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
a6a0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a6b0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
a6c0: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
a6d0: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
a6e0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
a6f0: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
a700: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
a710: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a720: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
a730: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ==0 );.      clo
a740: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
a750: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
a760: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a  Inode->pPrev ){.
a770: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a780: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
a790: 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Next==pInode );.
a7a0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a7b0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
a7c0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a7d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a7e0: 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65     assert( inode
a7f0: 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  List==pInode );.
a800: 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73          inodeLis
a810: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
a820: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a830: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65   if( pInode->pNe
a840: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
a850: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e  sert( pInode->pN
a860: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f  ext->pPrev==pIno
a870: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
a880: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
a890: 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ev = pInode->pPr
a8a0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
a8b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a8c0: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Inode);.    }.  
a8d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
a8e0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
a8f0: 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75  or, locate the u
a900: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a910: 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  ect that.** desc
a920: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
a930: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
a940: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
a950: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
a960: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
a970: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
a980: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
a990: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
a9a0: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
a9b0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
a9c0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
a9d0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
a9e0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
a9f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
aa00: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
aa10: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
aa20: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
aa30: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
aa40: 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69  InodeInfo(.  uni
aa50: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
aa70: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
aa80: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
aa90: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69  the key */.  uni
aaa0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49  xInodeInfo **ppI
aab0: 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52  node        /* R
aac0: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e  eturn the unixIn
aad0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68  odeInfo object h
aae0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
aaf0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
ab00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
ab10: 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e  stem call return
ab20: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66   code */.  int f
ab30: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
ab40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ab50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ab60: 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20   for pFile */.  
ab70: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
ab80: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
ab90: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
aba0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
abb0: 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  fo */.  struct s
abc0: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
abd0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
abe0: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
abf0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  tion */.  unixIn
ac00: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
ac10: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  = 0;     /* Cand
ac20: 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49  idate unixInodeI
ac30: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  nfo object */.. 
ac40: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
ac50: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
ac60: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
ac70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
ac80: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
ac90: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
aca0: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
acb0: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
acc0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
acd0: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
ace0: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
acf0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
ad00: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
ad10: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
ad20: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
ad30: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
ad40: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ad50: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
ad60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
ad70: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
ad80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
ad90: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
ada0: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
adb0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
adc0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
add0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
ade0: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
adf0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
ae00: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
ae10: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
ae20: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
ae30: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
ae40: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
ae50: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
ae60: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
ae70: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
ae80: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
ae90: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
aea0: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
aeb0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
aec0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
aed0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
aee0: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
aef0: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
af00: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
af10: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
af20: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
af30: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
af40: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
af50: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
af60: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
af70: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
af80: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
af90: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
afa0: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
afb0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
afc0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
afd0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
afe0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
aff0: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
b000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
b010: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
b020: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
b030: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
b040: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
b050: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
b060: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
b070: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
b080: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
b090: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
b0a0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =1 ){.      pFil
b0b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
b0c0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
b0d0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
b0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
b0f0: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
b100: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
b110: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  c!=0 ){.      pF
b120: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
b130: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
b140: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
b150: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
b160: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
b170: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
b180: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
b190: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
b1a0: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
b1b0: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
b1c0: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
b1d0: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
b1e0: 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  Id.ino = statbuf
b1f0: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
b200: 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
b210: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
b220: 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28  Inode && memcmp(
b230: 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65  &fileId, &pInode
b240: 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66  ->fileId, sizeof
b250: 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20  (fileId)) ){.   
b260: 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
b270: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
b280: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
b290: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c      pInode = sql
b2a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
b2b0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a  eof(*pInode) );.
b2c0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d      if( pInode==
b2d0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
b2e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
b2f0: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
b300: 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  (pInode, 0, size
b310: 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20  of(*pInode));.  
b320: 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65    memcpy(&pInode
b330: 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49  ->fileId, &fileI
b340: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
b350: 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ));.    pInode->
b360: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  nRef = 1;.    pI
b370: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e  node->pNext = in
b380: 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e  odeList;.    pIn
b390: 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ode->pPrev = 0;.
b3a0: 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73      if( inodeLis
b3b0: 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70  t ) inodeList->p
b3c0: 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  Prev = pInode;. 
b3d0: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
b3e0: 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Inode;.  }else{.
b3f0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
b400: 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f  ++;.  }.  *ppIno
b410: 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72  de = pInode;.  r
b420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b440: 20 54 52 55 45 20 69 66 20 70 46 69 6c 65 20 68   TRUE if pFile h
b450: 61 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  as been renamed 
b460: 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63  or unlinked sinc
b470: 65 20 69 74 20 77 61 73 20 66 69 72 73 74 20 6f  e it was first o
b480: 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pened..*/.static
b490: 20 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76 65   int fileHasMove
b4a0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
b4b0: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e){.  struct sta
b4c0: 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20  t buf;.  return 
b4d0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
b4e0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 28 6f 73   &&.         (os
b4f0: 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74  Stat(pFile->zPat
b500: 68 2c 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62  h, &buf)!=0 || b
b510: 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65  uf.st_ino!=pFile
b520: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
b530: 2e 69 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  .ino);.}.../*.**
b540: 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c   Check a unixFil
b550: 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61  e that is a data
b560: 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68  base.  Verify th
b570: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
b580: 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20  ** (1) There is 
b590: 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64  exactly one hard
b5a0: 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c   link on the fil
b5b0: 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c  e.** (2) The fil
b5c0: 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
b5d0: 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20  lic link.** (3) 
b5e0: 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  The file has not
b5f0: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
b600: 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20   unlinked.**.** 
b610: 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f  Issue sqlite3_lo
b620: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b630: 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69  ,...) messages i
b640: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f  f anything is no
b650: 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  t right..*/.stat
b660: 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62  ic void verifyDb
b670: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
b680: 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20  File){.  struct 
b690: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20  stat buf;.  int 
b6a0: 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  rc;.  if( pFile-
b6b0: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b6c0: 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b 0a  XFILE_WARNED ){.
b6d0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
b6e0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
b6f0: 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61 76  ing warnings hav
b700: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  e already been i
b710: 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a 20  ssued.  Do not. 
b720: 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68 65     ** repeat the
b730: 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63  m so as not to c
b740: 6c 75 74 74 65 72 20 74 68 65 20 65 72 72 6f 72  lutter the error
b750: 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74 75   log */.    retu
b760: 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6f  rn;.  }.  rc = o
b770: 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
b780: 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63   &buf);.  if( rc
b790: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
b7a0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b7b0: 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66  RNING, "cannot f
b7c0: 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22  stat db file %s"
b7d0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b7e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
b7f0: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
b800: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
b810: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b820: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20  buf.st_nlink==0 
b830: 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  && (pFile->ctrlF
b840: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b850: 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
b860: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b870: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
b880: 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69  ile unlinked whi
b890: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
b8a0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
b8b0: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
b8c0: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
b8d0: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
b8e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e  ;.  }.  if( buf.
b8f0: 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20  st_nlink>1 ){.  
b900: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b910: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d  LITE_WARNING, "m
b920: 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f  ultiple links to
b930: 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c   file: %s", pFil
b940: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b950: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b960: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b970: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b980: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61    }.  if( fileHa
b990: 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b  sMoved(pFile) ){
b9a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b9b0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
b9c0: 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77   "file renamed w
b9d0: 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20  hile open: %s", 
b9e0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
b9f0: 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
ba00: 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
ba10: 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75  WARNED;.    retu
ba20: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn;.  }.}.../*.*
ba30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ba40: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
ba50: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
ba60: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
ba70: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
ba80: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
ba90: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
baa0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
bab0: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
bac0: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
bad0: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
bae0: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
baf0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
bb00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
bb10: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
bb20: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
bb30: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
bb40: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
bb50: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
bb60: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
bb70: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
bb80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
bb90: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
bba0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bbb0: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
bbc0: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
bbd0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
bbe0: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
bbf0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
bc00: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
bc10: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
bc20: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
bc30: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
bc40: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
bc50: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
bc60: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
bc70: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
bc80: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
bc90: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
bca0: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
bcb0: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
bcc0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
bcd0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
bce0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
bcf0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
bd00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
bd10: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
bd20: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
bd30: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
bd40: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
bd50: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
bd60: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
bd70: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
bd80: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
bd90: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
bda0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
bdb0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
bdc0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
bdd0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
bde0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
bdf0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
be00: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
be10: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
be20: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
be30: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
be40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
be50: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
be60: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
be70: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
be80: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
be90: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
bea0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  NLCK ){.      re
beb0: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
bec0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
bed0: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
bee0: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
bef0: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
bf00: 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  %d %d (unix)\n",
bf10: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
bf20: 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
bf30: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
bf40: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
bf50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
bf60: 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d   to set a system
bf70: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
bf80: 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f  e pFile.  The lo
bf90: 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69  ck is .** descri
bfa0: 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a  bed by pLock..**
bfb0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65  .** If the pFile
bfc0: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
bfd0: 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78  /write from unix
bfe0: 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20  -excl, then the 
bff0: 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65  only lock.** eve
c000: 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e  r obtained is an
c010: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
c020: 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69   and it is obtai
c030: 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ned exactly once
c040: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
c050: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
c060: 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73  ttempted.  All s
c070: 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d  ubsequent system
c080: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72   locking.** oper
c090: 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f  ations become no
c0a0: 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f  -ops.  Locking o
c0b0: 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20  perations still 
c0c0: 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c  happen internall
c0d0: 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  y,.** in order t
c0e0: 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63  o coordinate acc
c0f0: 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61  ess between sepa
c100: 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  rate database co
c110: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74  nnections.** wit
c120: 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hin this process
c130: 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61  , but all of tha
c140: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  t is handled in 
c150: 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a  memory and the.*
c160: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
c170: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74  em does not part
c180: 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  icipate..**.** T
c190: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c1a0: 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74  a pass-through t
c1b0: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29  o fcntl(F_SETLK)
c1c0: 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69   if pFile is usi
c1d0: 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74  ng.** any VFS ot
c1e0: 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65  her than "unix-e
c1f0: 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65  xcl" or if pFile
c200: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75   is opened on "u
c210: 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64  nix-excl".** and
c220: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
c230: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
c240: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
c250: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  l completes succ
c260: 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20  essfully, or -1 
c270: 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  if a call.** to 
c280: 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49  fcntl() fails. I
c290: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72  n this case, err
c2a0: 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70  no is set approp
c2b0: 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74  riately (by fcnt
c2c0: 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  l())..*/.static 
c2d0: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
c2e0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
c2f0: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
c300: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
c310: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
c320: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
c330: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
c340: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
c350: 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ld() );.  assert
c360: 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20  ( pInode!=0 );. 
c370: 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74   if( ((pFile->ct
c380: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
c390: 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70  LE_EXCL)!=0 || p
c3a0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
c3b0: 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69  ock).   && ((pFi
c3c0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
c3d0: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
c3e0: 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  ==0).  ){.    if
c3f0: 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
c400: 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
c410: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
c420: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
c430: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
c440: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f  k==0 );.      lo
c450: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
c460: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
c470: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
c480: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
c490: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
c4a0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
c4b0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
c4c0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63  _WRLCK;.      rc
c4d0: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
c4e0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
c4f0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
c500: 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63  rc<0 ) return rc
c510: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
c520: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31  bProcessLock = 1
c530: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
c540: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nLock++;.    }el
c550: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  se{.      rc = 0
c560: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
c570: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
c580: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
c590: 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d  TLK, pLock);.  }
c5a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c5b0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
c5c0: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
c5d0: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
c5e0: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
c5f0: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
c600: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
c610: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
c620: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
c630: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
c640: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
c650: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
c660: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
c670: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
c680: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
c690: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
c6a0: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
c6b0: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
c6c0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
c6d0: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
c6e0: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
c6f0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
c700: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
c710: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
c720: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
c730: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
c740: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
c750: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
c760: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
c770: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
c780: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
c790: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
c7a0: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
c7b0: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
c7c0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
c7d0: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
c7e0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
c7f0: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
c800: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
c810: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
c820: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
c830: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
c840: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
c850: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
c860: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
c870: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
c880: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
c890: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
c8a0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
c8b0: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
c8c0: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
c8d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c8e0: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
c8f0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
c900: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
c910: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
c920: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
c930: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
c940: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
c950: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
c960: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
c970: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
c980: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
c990: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
c9a0: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
c9b0: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
c9c0: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
c9d0: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
c9e0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
c9f0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
ca00: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
ca10: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
ca20: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
ca30: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
ca40: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
ca50: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
ca60: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
ca70: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
ca80: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
ca90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
caa0: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
cab0: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
cac0: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
cad0: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
cae0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
caf0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
cb00: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
cb10: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
cb20: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
cb30: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
cb40: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
cb50: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
cb60: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
cb70: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
cb80: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
cb90: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
cba0: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
cbb0: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
cbc0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
cbd0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
cbe0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
cbf0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
cc00: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
cc10: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
cc20: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
cc30: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
cc40: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
cc50: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
cc60: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
cc70: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
cc80: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
cc90: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
cca0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
ccb0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
ccc0: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
ccd0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
cce0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
ccf0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
cd00: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
cd10: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
cd20: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
cd30: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
cd40: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
cd50: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
cd60: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
cd70: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
cd80: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
cd90: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
cda0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
cdb0: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
cdc0: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
cdd0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
cde0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
cdf0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
ce00: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
ce10: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
ce20: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
ce30: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
ce40: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
ce50: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
ce60: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
ce70: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
ce80: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
ce90: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
cea0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
ceb0: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
cec0: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
ced0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
cee0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
cef0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
cf00: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
cf10: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
cf20: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
cf30: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
cf40: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
cf50: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
cf60: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
cf70: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
cf80: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
cf90: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
cfa0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
cfb0: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
cfc0: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
cfd0: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
cfe0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
cff0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
d000: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
d010: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
d020: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
d030: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
d040: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
d050: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
d060: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
d070: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
d080: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
d090: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
d0a0: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
d0b0: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
d0c0: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
d0d0: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
d0e0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
d0f0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
d100: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
d110: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
d120: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
d130: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
d140: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
d150: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d160: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
d170: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
d180: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
d190: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
d1a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
d1b0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b   int tErrno = 0;
d1c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
d1d0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
d1e0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
d1f0: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
d200: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
d210: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61  File->h,.      a
d220: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
d230: 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
d240: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
d250: 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  k),.      azFile
d260: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  Lock(pFile->pIno
d270: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
d280: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
d290: 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
d2a0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
d2b0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
d2c0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
d2d0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
d2e0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
d2f0: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
d300: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
d310: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
d320: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
d330: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
d340: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
d350: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
d360: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
d370: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
d380: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
d390: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d3a0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
d3b0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
d3c0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
d3d0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
d3e0: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
d3f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d400: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
d410: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
d420: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
d430: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
d440: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
d450: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
d460: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
d470: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
d480: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
d490: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
d4a0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
d4b0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
d4c0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
d4d0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
d4e0: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
d4f0: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
d500: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
d510: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
d520: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
d530: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
d540: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
d550: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
d560: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
d570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
d580: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
d590: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
d5a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d5b0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
d5c0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
d5d0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
d5e0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
d5f0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
d600: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
d610: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
d620: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
d630: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
d640: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
d650: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
d660: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
d670: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
d680: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
d690: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
d6a0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
d6b0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
d6c0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
d6d0: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
d6e0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
d6f0: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
d700: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
d710: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
d720: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
d730: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
d740: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
d750: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
d760: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
d770: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
d780: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
d790: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
d7a0: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
d7b0: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
d7c0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
d7d0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
d7e0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
d7f0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
d800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d810: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
d820: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d830: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
d840: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d850: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
d860: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
d870: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
d880: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
d890: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
d8a0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
d8b0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
d8c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
d8d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d8e0: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
d8f0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
d900: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
d910: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
d920: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
d930: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d940: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
d950: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
d960: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
d970: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
d980: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
d990: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
d9a0: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
d9b0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
d9c0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
d9d0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
d9e0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
d9f0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
da00: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
da10: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
da20: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
da30: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
da40: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
da50: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
da60: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
da70: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
da80: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
da90: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
daa0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
dab0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
dac0: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
dad0: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
dae0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
daf0: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
db00: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
db10: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
db20: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
db30: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
db40: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
db50: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
db60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
db70: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
db80: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
db90: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
dba0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
dbb0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
dbc0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
dbd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
dbe0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
dbf0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
dc00: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
dc10: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
dc20: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
dc30: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
dc40: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
dc50: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
dc60: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
dc70: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
dc80: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
dc90: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
dca0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
dcb0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
dcc0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
dcd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
dce0: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
dcf0: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
dd00: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dd10: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
dd20: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
dd30: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
dd40: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
dd50: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
dd60: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
dd70: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
dd80: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
dd90: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
dda0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ddb0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
ddc0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
ddd0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
dde0: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
ddf0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
de00: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
de10: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
de20: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
de30: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
de40: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
de50: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
de60: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
de70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
de80: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
de90: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
dea0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
deb0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
dec0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ded0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
dee0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
def0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
df00: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
df10: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
df20: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
df30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
df40: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
df50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df60: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
df70: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
df80: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
df90: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
dfa0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
dfb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
dfc0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
dfd0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
dfe0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
dff0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
e000: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
e010: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
e020: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
e030: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
e040: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
e050: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
e060: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
e070: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
e080: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
e090: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
e0a0: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
e0b0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
e0c0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
e0d0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
e0e0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
e0f0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
e100: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
e110: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
e120: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
e130: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
e140: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
e150: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e160: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
e170: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
e180: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
e190: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
e1a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
e1b0: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
e1c0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
e1d0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
e1e0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
e1f0: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
e200: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
e210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
e220: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
e230: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
e240: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
e250: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
e260: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
e270: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e280: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
e290: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e2a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e2b0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e2c0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e2d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
e2e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e2f0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
e300: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e310: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
e320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e330: 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.  ..#ifdef SQL
e340: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53  ITE_DEBUG.  /* S
e350: 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
e360: 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
e370: 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
e380: 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
e390: 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
e3a0: 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
e3b0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
e3c0: 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
e3d0: 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
e3e0: 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
e3f0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
e400: 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
e410: 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
e420: 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
e430: 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
e440: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e450: 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
e460: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
e470: 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
e480: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
e490: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
e4a0: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
e4b0: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
e4c0: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
e4d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
e4e0: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
e4f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
e500: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e510: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
e520: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
e530: 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
e540: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
e550: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
e560: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e570: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
e580: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
e590: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
e5a0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
e5b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
e5c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
e5d0: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
e5e0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e5f0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
e600: 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
e610: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
e620: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
e630: 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
e640: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
e650: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
e660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e670: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
e680: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e690: 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
e6a0: 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
e6b0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
e6c0: 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
e6d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e6e0: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
e6f0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
e700: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
e710: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
e720: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
e730: 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
e740: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
e750: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
e760: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f  >pUnused;.  pIno
e770: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b  de->pUnused = p;
e780: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31  .  pFile->h = -1
e790: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ;.  pFile->pUnus
e7a0: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
e7b0: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
e7c0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
e7d0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
e7e0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
e7f0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
e800: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
e810: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
e820: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
e830: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e840: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
e850: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
e860: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
e870: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
e880: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
e890: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e8a0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  no-op..** .** If
e8b0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
e8c0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
e8d0: 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e  n downgrading an
e8e0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
e8f0: 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65  to SHARED.** the
e900: 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64   byte range is d
e910: 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61  ivided into 2 pa
e920: 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73  rts and the firs
e930: 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b  t part is unlock
e940: 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74  ed then.** set t
e950: 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74  o a read lock, t
e960: 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61  hen the other pa
e970: 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c  rt is simply unl
e980: 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72  ocked.  This wor
e990: 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20  ks .** around a 
e9a0: 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c  bug in BSD NFS l
e9b0: 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20  ockd (also seen 
e9c0: 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29  on MacOSX 10.3+)
e9d0: 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a   that fails to .
e9e0: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72  ** remove the wr
e9f0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite lock on a re
ea00: 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64  gion when a read
ea10: 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f   lock is set..*/
ea20: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
ea30: 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
ea40: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
ea50: 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e  ileLock, int han
ea60: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20  dleNFSUnlock){. 
ea70: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ea80: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ea90: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
eaa0: 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
eab0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
eac0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ead0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
eae0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
eaf0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
eb00: 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
eb10: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
eb20: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
eb30: 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70  ileLock,.      p
eb40: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
eb50: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
eb60: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
eb70: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
eb80: 64 2c 0a 20 20 20 20 20 20 67 65 74 70 69 64 28  d,.      getpid(
eb90: 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
eba0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
ebb0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
ebc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ebd0: 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
ebe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ebf0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
ec00: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
ec10: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ec20: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
ec30: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ec40: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
ec50: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
ec60: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
ec70: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
ec80: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
ec90: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
eca0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ecb0: 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
ecc0: 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
ecd0: 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
ece0: 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
ecf0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
ed00: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ed10: 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
ed20: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
ed30: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
ed40: 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
ed50: 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
ed60: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
ed70: 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
ed80: 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
ed90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
eda0: 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
edb0: 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
edc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
edd0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
ede0: 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
edf0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
ee00: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
ee10: 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
ee20: 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
ee30: 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
ee40: 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
ee50: 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
ee60: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
ee70: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
ee80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69  ..    */.    pFi
ee90: 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
eea0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
eeb0: 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e     /* downgradin
eec0: 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  g to a shared lo
eed0: 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76  ck on NFS involv
eee0: 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  es clearing the 
eef0: 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a  write lock.    *
ef00: 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69  * before establi
ef10: 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f  shing the readlo
ef20: 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ck - to avoid a 
ef30: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
ef40: 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20  e downgrade.    
ef50: 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32  ** the lock in 2
ef60: 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74   blocks, so that
ef70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e   part of the ran
ef80: 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72  ge will be cover
ef90: 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20  ed by a .    ** 
efa0: 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c  write lock until
efb0: 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76   the rest is cov
efc0: 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c  ered by a read l
efd0: 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20  ock:.    **  1: 
efe0: 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a    [WWWWW].    **
eff0: 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20    2:   [....W]. 
f000: 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52     **  3:   [RRR
f010: 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20  RW].    **  4:  
f020: 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a   [RRRR.].    */.
f030: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
f040: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
f050: 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  {..#if !defined(
f060: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
f070: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
f080: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
f090: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
f0a0: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
f0b0: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
f0c0: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
f0d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
f0e0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
f0f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f100: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
f110: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
f120: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
f130: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
f140: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
f150: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
f160: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
f170: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
f180: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
f190: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
f1a0: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
f1b0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f1c0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f1d0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f1e0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
f1f0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
f200: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
f210: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
f220: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
f230: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f240: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
f250: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
f260: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
f270: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f280: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f290: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  OCK;.          i
f2a0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f2b0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
f2c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f2d0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
f2e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f2f0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f300: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
f310: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
f320: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
f330: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
f340: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
f350: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f360: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f370: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
f380: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
f390: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
f3a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f3b0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
f3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
f3d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f3e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f3f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
f400: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
f410: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
f420: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
f430: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
f440: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
f450: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f460: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
f470: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f480: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f490: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
f4a0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
f4b0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
f4c0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
f4d0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
f4e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f4f0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f500: 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
f510: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
f520: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
f530: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f540: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f550: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f560: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
f570: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f580: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f590: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f5a0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
f5b0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f5c0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
f5d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f5e0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
f5f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f600: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f610: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f620: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
f630: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
f640: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
f650: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f660: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
f670: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
f680: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
f690: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f6a0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f6b0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f6c0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f6d0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f6e0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f6f0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f700: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f710: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f720: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
f730: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
f740: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
f750: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
f760: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
f770: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
f780: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
f790: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
f7a0: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
f7b0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
f7c0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
f7d0: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
f7e0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
f7f0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
f800: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
f810: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
f820: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
f830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
f840: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
f850: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
f860: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
f870: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
f880: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
f890: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
f8a0: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
f8b0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
f8c0: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
f8d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f8e0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
f8f0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
f900: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
f910: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
f920: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f940: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
f950: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
f960: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
f970: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
f980: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f990: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
f9a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
f9b0: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
f9c0: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
f9d0: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
f9e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f9f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
fa00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
fa10: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
fa20: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
fa30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
fa40: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
fa50: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
fa60: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fa70: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67  = errno;.      g
fa80: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
fa90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
faa0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
fab0: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
fac0: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
fad0: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
fae0: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
faf0: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
fb00: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
fb10: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
fb20: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
fb30: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
fb40: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
fb50: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
fb60: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
fb70: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
fb80: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
fb90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
fba0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
fbb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
fbc0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
fbd0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
fbe0: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
fbf0: 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  L;.      if( uni
fc00: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
fc10: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
fc20: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
fc30: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
fc40: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
fc50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
fc60: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
fc70: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
fc80: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
fc90: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f  no;.        pIno
fca0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
fcb0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
fcc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
fcd0: 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
fce0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
fcf0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
fd00: 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20   count of locks 
fd10: 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d  against this sam
fd20: 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68  e file.  When th
fd30: 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72  e.    ** count r
fd40: 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f  eaches zero, clo
fd50: 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c  se any other fil
fd60: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68  e descriptors wh
fd70: 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ose close.    **
fd80: 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65   was deferred be
fd90: 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e  cause of outstan
fda0: 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20  ding locks..    
fdb0: 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
fdc0: 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
fdd0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
fde0: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k>=0 );.    if( 
fdf0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
fe00: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50   ){.      closeP
fe10: 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
fe20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64  ;.    }.  }..end
fe30: 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  _unlock:.  unixL
fe40: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
fe50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fe60: 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
fe70: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
fe80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fe90: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
fea0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
feb0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
fec0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
fed0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
fee0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
fef0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
ff00: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
ff10: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
ff20: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
ff30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
ff40: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
ff50: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
ff60: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
ff70: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
ff80: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ff90: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
ffa0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
ffb0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
ffc0: 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49  eLock){.#if SQLI
ffd0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
ffe0: 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  >0.  assert( eFi
fff0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
10000 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c  OCK || ((unixFil
10010 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f  e *)id)->nFetchO
10020 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ut==0 );.#endif.
10030 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
10040 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
10050 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53  ck, 0);.}..#if S
10060 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
10070 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
10080 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69   unixMapfile(uni
10090 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20  xFile *pFd, i64 
100a0 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76  nByte);.static v
100b0 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  oid unixUnmapfil
100c0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
100d0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
100e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
100f0 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
10100 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
10110 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
10120 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
10130 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
10140 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
10150 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
10160 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
10170 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
10180 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
10190 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
101a0 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
101b0 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
101c0 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
101d0 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
101e0 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
101f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10200 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
10210 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
10220 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
10230 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
10240 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
10250 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
10260 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
10270 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
10280 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
10290 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
102a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
102b0 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c  ile*)id;.#if SQL
102c0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
102d0 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66  E>0.  unixUnmapf
102e0 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64  ile(pFile);.#end
102f0 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  if.  if( pFile->
10300 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  h>=0 ){.    robu
10310 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
10320 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
10330 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
10340 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20  h = -1;.  }.#if 
10350 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
10360 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
10370 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74     if( pFile->ct
10380 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
10390 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
103a0 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c     osUnlink(pFil
103b0 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
103c0 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  alName);.    }. 
103d0 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
103e0 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
103f0 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  Id);.    pFile->
10400 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  pId = 0;.  }.#en
10410 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
10420 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
10430 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
10440 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
10450 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10460 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
10470 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
10480 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
10490 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
104a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
104b0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
104c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
104d0 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
104e0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
104f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10500 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
10510 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
10520 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62  *)id;.  verifyDb
10530 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  File(pFile);.  u
10540 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
10550 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
10560 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
10570 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
10580 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
10590 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
105a0 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
105b0 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
105c0 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
105d0 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
105e0 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
105f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10600 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
10610 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
10620 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
10630 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
10640 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
10650 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
10660 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
10670 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
10680 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10690 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
106a0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
106b0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
106c0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
106d0 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
106e0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
106f0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
10700 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
10710 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
10720 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
10730 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
10740 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
10750 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
10760 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
10770 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
10780 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
10790 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
107a0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
107b0 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
107c0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
107d0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
107e0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
107f0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
10800 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10810 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
10820 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
10830 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
10840 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10890 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
10910 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
10940 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
10950 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
10960 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
10970 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
10980 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
10990 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
109a0 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
109b0 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
109c0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
109d0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
109e0 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
109f0 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
10a00 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
10a10 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
10a20 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
10a30 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
10a40 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10a50 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10a60 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
10a70 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
10a80 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
10a90 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
10aa0 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
10ab0 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
10ac0 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
10ad0 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
10ae0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10af0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
10b00 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10b10 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
10b20 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
10b30 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
10b40 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10b50 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10b60 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
10b70 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
10b80 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
10b90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10ba0 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
10bb0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10bc0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
10bd0 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
10be0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
10bf0 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
10c00 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
10c10 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10c20 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
10c30 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10c40 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10c50 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10c60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
10c70 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
10c80 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
10c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10ca0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
10cb0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10cc0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
10cd0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
10ce0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
10cf0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
10d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10d10 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
10d20 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
10d30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10d40 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10d50 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10d60 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10d70 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
10d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10da0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
10db0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
10dc0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10dd0 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
10de0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10df0 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10e10 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
10e20 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10e30 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10e40 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e90 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
10ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ee0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f00 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
10f10 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f30 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
10f40 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
10f50 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10f60 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
10f70 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
10f80 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
10f90 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
10fa0 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
10fb0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
10fc0 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
10fd0 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
10fe0 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
10ff0 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
11000 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
11010 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
11020 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
11030 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
11040 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
11050 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
11060 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
11070 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
11080 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
11090 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
110a0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
110b0 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
110c0 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
110d0 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
110e0 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
110f0 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
11100 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
11110 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
11120 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
11130 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
11140 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
11150 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
11160 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
11170 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
11180 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
11190 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
111a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
111b0 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
111c0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
111d0 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
111e0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
111f0 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
11200 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
11210 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
11220 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
11230 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
11240 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
11250 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
11260 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
11270 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
11280 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
11290 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
112a0 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
112b0 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
112c0 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
112d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
112e0 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
112f0 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
11300 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
11310 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
11320 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
11330 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
11340 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
11350 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
11360 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11370 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
11380 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
11390 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
113a0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
113b0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
113c0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
113d0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
113e0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
113f0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11400 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11410 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11420 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11430 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11440 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11450 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11460 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11470 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
11480 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
11490 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
114a0 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
114b0 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
114c0 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
114d0 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
114e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
114f0 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
11500 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
11510 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
11520 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
11530 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
11540 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11560 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11570 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11580 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11590 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
115a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
115b0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
115c0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
115d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
115e0 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
115f0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
11600 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
11610 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
11620 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
11630 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
11640 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11650 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11660 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11670 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
11680 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11690 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
116a0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
116b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
116c0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
116d0 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
116e0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
116f0 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
11700 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
11710 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
11720 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
11730 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
11740 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
11750 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
11760 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
11770 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
11780 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11790 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
117a0 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
117b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
117c0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
117d0 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
117e0 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
117f0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11800 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11810 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
11820 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
11830 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
11840 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11860 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11870 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11880 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11890 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
118a0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
118b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
118c0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
118d0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
118e0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
118f0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11900 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11910 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11920 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11930 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11940 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11950 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11960 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11970 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11980 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11990 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
119a0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
119b0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
119c0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
119d0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
119e0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
119f0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11a00 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11a10 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11a20 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11a30 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11a40 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11a50 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11a60 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11a70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11a80 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11a90 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11aa0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11ab0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11ac0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11ad0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11ae0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11af0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11b00 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11b10 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
11b20 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11b30 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11b40 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11b50 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11b60 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11b70 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11b80 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
11b90 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
11ba0 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
11bb0 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
11bc0 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
11bd0 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
11be0 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
11bf0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
11c00 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11c10 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11c20 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11c30 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11c40 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11c50 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11c60 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11c70 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
11c80 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11c90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11ca0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
11cb0 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
11cc0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
11cd0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
11ce0 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
11cf0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
11d00 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
11d10 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
11d20 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
11d30 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11d40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11d50 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11d60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11d70 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
11d80 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
11d90 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
11da0 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
11db0 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
11dc0 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
11dd0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11de0 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
11df0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11e00 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11e20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
11e30 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11e40 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11e50 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11e60 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
11e70 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
11e80 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
11e90 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
11ea0 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
11eb0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11ec0 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11ed0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
11ee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11ef0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11f00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11f10 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
11f20 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11f30 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
11f40 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11f50 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11f60 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11f70 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11f90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11fa0 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
11fb0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
11fc0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
11fd0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
11fe0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
11ff0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12000 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12010 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12020 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
12030 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
12040 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
12050 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
12060 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
12070 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
12080 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
12090 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
120a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
120b0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
120c0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
120d0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
120e0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
120f0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
12100 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
12110 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
12120 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
12130 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
12140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12150 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
12160 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12170 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
12180 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12190 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
121a0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
121b0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
121c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
121d0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
121e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
121f0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
12200 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
12210 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
12220 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
12230 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
12240 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12250 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
12260 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
12270 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
12280 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
12290 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
122a0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
122b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
122c0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
122d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
122e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
122f0 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
12300 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
12310 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
12320 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
12330 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
12340 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
12350 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
12360 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
12370 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
12380 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
12390 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
123a0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
123b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
123c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
123d0 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
123e0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
123f0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12400 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
12410 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
12420 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
12430 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
12440 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
12450 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49  && errno==ENOTDI
12460 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e  R ) rc = osUnlin
12470 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  k(zLockFile);.  
12480 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
12490 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
124a0 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a  no;.    rc = 0;.
124b0 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
124c0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
124d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
124e0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
124f0 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
12500 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12510 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
12520 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
12530 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
12540 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
12550 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
12560 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
12570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12580 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
12590 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
125a0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
125b0 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
125c0 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
125d0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
125e0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
125f0 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
12600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12610 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
12620 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12630 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12640 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
12650 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
12660 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12670 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12680 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
12690 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
126a0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
126b0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
126d0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
126e0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
126f0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12700 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12750 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
127d0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
12800 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
12810 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
12820 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
12830 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
12840 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
12850 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
12860 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
12870 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
12880 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
12890 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
128a0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
128b0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
128c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
128d0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
128e0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
128f0 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
12900 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
12910 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
12920 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12930 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
12940 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
12950 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
12960 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
12970 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
12980 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12990 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
129a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
129b0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
129c0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
129d0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
129e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
129f0 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12a00 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
12a10 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
12a20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12a30 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12a40 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12a50 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
12a60 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
12a70 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
12a80 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
12a90 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
12aa0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
12ab0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
12ac0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
12ad0 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
12ae0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
12af0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
12b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12b10 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
12b20 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
12b30 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
12b40 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
12b50 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
12b60 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
12b70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
12b80 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
12b90 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
12ba0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
12bb0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
12bc0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
12bd0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
12be0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
12bf0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12c00 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12c10 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12c20 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12c30 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12c40 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
12c50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
12c60 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
12c70 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
12c80 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
12c90 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
12ca0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
12cb0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
12cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12cd0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12ce0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12cf0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12d00 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
12d10 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12d20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12d30 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12d40 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12d50 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
12d60 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
12d70 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
12d80 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
12d90 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
12da0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12db0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
12dc0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
12dd0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
12de0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
12df0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12e00 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
12e10 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
12e20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
12e30 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
12e40 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
12e50 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
12e60 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
12e70 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
12e80 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
12e90 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
12ea0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
12eb0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
12ec0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12ed0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
12ee0 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
12ef0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
12f00 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12f10 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
12f20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
12f30 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
12f40 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
12f50 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
12f60 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12f70 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
12f80 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
12f90 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12fa0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
12fb0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
12fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
12fd0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
12fe0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12ff0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
13000 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
13010 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
13020 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
13030 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
13040 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13050 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13060 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13070 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
13080 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
13090 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
130a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
130b0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
130c0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
130d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
130e0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
130f0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
13100 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
13110 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
13120 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
13130 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13140 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
13150 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
13160 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
13170 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
13180 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13190 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
131a0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
131b0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
131c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
131d0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
131e0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
131f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
13200 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
13210 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
13220 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
13230 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
13240 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
13250 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
13260 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
13270 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
13280 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
13290 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
132a0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
132b0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
132c0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
132d0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
132e0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
132f0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
13300 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
13310 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
13320 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
13330 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
13340 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
13350 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
13360 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
13370 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
13380 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
13390 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
133a0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
133b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
133c0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
133d0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
133e0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
133f0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
13400 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
13410 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
13420 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13430 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13440 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
13450 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13460 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
13470 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
13480 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
13490 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
134a0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
134b0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
134c0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
134d0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
134e0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
134f0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
13500 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
13510 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
13520 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
13530 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
13540 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
13550 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
13560 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
13570 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
13580 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
13590 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
135a0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
135b0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
135c0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
135d0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
135e0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
135f0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
13600 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
13610 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
13620 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13630 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13640 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13650 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
13660 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13670 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
13680 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13690 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
136a0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
136b0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
136c0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
136d0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
136e0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
136f0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
13700 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
13710 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13720 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13730 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13750 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
13760 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13770 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
13780 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
13790 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
137a0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
137b0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
137c0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
137d0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
137e0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
137f0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
13800 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
13810 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
13820 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
13830 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13840 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13850 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13860 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
13870 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
13880 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13890 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
138a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
138b0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
138c0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
138d0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
138e0 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
138f0 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
13900 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
13910 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
13920 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
13930 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
13940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13950 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13960 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
13970 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
13980 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
13990 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
139a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
139b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
139c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
139d0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
139e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
139f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13a00 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13a10 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13a20 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13a30 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13a40 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13a50 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13a60 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13a70 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13a80 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13a90 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
13aa0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
13ab0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
13ac0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
13ad0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13ae0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13af0 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
13b00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13b10 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13b20 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
13b30 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13b40 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
13b50 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13b60 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13b70 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
13b80 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
13b90 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
13ba0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
13bb0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13bc0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
13bd0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13be0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
13bf0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13c00 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13c10 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13c20 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13c30 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13c50 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13c60 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
13c70 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
13c80 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
13c90 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
13ca0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13cb0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13cc0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13cd0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13cf0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
13d00 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
13d10 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
13d20 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13d30 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
13d40 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13d50 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d70 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
13d80 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13d90 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13da0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
13db0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13dc0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
13dd0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13de0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
13df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13e00 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
13e10 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
13e20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
13e30 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
13e40 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
13e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13e60 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
13e70 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
13e80 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72   NO_LOCK);.    r
13e90 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13ea0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
13eb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
13ec0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
13ed0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
13ee0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
13ef0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13f00 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
13f10 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
13f20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f40 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
13fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fe0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
13ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
14000 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
14010 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
14020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14030 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
14040 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
14050 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
14060 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
14070 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
14080 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
14090 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
140a0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
140b0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
140c0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
140d0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
140e0 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
140f0 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
14100 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
14110 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
14120 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
14130 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
14140 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
14150 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
14160 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
14170 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
14180 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
14190 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
141a0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
141b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
141c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
141d0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
141e0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
141f0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
14200 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
14210 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
14220 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
14230 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
14240 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
14250 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
14260 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
14270 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
14280 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
14290 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
142a0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
142b0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
142c0 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
142d0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
142e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
142f0 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
14300 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14310 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
14320 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
14330 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14340 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
14350 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
14360 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14370 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
14380 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
14390 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
143a0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
143b0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
143c0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
143d0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
143e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
143f0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
14400 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
14410 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
14420 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
14430 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14440 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
14450 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
14460 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
14470 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
14480 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
14490 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
144a0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
144b0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
144c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
144d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
144e0 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
144f0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
14500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14510 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14520 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
14530 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14540 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
14550 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14560 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
14570 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
14580 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
14590 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
145a0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
145b0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
145c0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
145d0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
145e0 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
145f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14600 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
14610 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
14620 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
14630 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
14640 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
14650 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
14660 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
14670 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
14680 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
14690 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
146a0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
146b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
146c0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
146d0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
146e0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
146f0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
14700 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
14710 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
14720 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
14730 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14740 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14750 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14760 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14770 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
14780 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
14790 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
147a0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
147b0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
147c0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
147d0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
147e0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
147f0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
14800 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14810 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14820 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14830 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14840 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14850 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14860 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14870 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
14880 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
14890 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
148a0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
148b0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
148c0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
148d0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
148e0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
148f0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
14900 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14910 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14920 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14930 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14940 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14950 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14960 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14970 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
14980 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
14990 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
149a0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
149b0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
149c0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
149d0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
149e0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
149f0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
14a00 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
14a10 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
14a20 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
14a30 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
14a40 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
14a50 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
14a60 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
14a70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
14a80 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
14a90 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
14aa0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
14ab0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
14ac0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
14ad0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
14ae0 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
14af0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14b00 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14b10 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14b20 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14b30 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
14b40 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
14b50 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
14b60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14b70 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
14b80 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
14b90 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
14ba0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
14bb0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
14bc0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
14bd0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
14be0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14bf0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
14c00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14c10 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14c20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14c30 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
14c40 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14c50 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
14c60 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
14c70 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
14c80 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
14c90 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
14ca0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
14cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
14cc0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
14cd0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14ce0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
14cf0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
14d00 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
14d10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14d20 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
14d30 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
14d40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14d50 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
14d60 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
14d70 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
14d80 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
14d90 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
14da0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
14db0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
14dc0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
14dd0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
14de0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
14df0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
14e00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
14e10 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14e20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
14e30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14e40 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14e50 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
14e60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14e70 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14e80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14e90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14ea0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
14eb0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
14ec0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
14ed0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14ee0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
14ef0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
14f00 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
14f10 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
14f20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
14f30 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
14f40 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14f50 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
14f60 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
14f70 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
14f80 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
14f90 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
14fa0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14fb0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
14fc0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
14fd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14fe0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
14ff0 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
15000 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
15010 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
15020 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
15030 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15040 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
15050 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
15060 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
15070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15080 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
15090 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
150a0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
150b0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
150c0 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
150d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
150e0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
150f0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15100 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
15110 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
15120 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15130 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
15140 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15150 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
15160 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
15170 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
15180 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
15190 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
151a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
151b0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
151c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
151d0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
151e0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
151f0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
15200 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15210 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
15220 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
15230 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
15240 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
15250 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
15260 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
15270 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
15280 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
15290 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
152a0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
152b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
152c0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
152d0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
152e0 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
152f0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
15300 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
15310 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
15320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
15330 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
15340 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
15350 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
153c0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
153d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15430 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
15440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15460 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
15470 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
15480 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
15490 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
154a0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
154b0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
154c0 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
154d0 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
154e0 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
154f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
15500 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
15510 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
15520 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
15530 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
15540 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
15550 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
15560 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
15570 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
15580 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
15590 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
155a0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
155b0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
155c0 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
155d0 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
155e0 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
155f0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
15600 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
15610 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
15620 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
15630 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
15640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15650 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
15660 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
15670 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15680 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
15690 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
156a0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
156b0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
156c0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
156d0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
156e0 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
156f0 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
15700 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
15710 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
15720 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
15730 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
15740 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
15750 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
15760 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
15770 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
15780 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
15790 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
157a0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
157b0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
157c0 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
157d0 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
157e0 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15810 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15820 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15830 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15840 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15850 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
15860 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
15870 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
15880 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
15890 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
158a0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
158b0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
158c0 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
158d0 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
158e0 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
158f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15900 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15910 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15920 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15930 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15940 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15950 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15960 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
15970 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
15980 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
15990 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
159a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
159b0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
159c0 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
159d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
159e0 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
159f0 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15a00 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15a10 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15a20 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15a30 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15a40 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15a50 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
15a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15a70 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
15a80 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
15a90 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
15aa0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
15ab0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
15ac0 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15ad0 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15ae0 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15af0 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15b00 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15b10 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15b20 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15b30 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15b40 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15b50 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15b60 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
15b70 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
15b80 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
15b90 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
15ba0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
15bb0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
15bc0 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15bd0 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15be0 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15bf0 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15c00 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15c10 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15c20 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15c30 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15c40 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15c50 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
15c60 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
15c70 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
15c80 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
15c90 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
15ca0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
15cb0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
15cc0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15cd0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15ce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15cf0 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15d00 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15d10 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15d20 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15d30 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15d40 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15d50 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
15d60 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
15d70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
15d80 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15d90 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
15da0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15db0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15dc0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15dd0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
15de0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15df0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
15e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15e10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15e20 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15e30 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
15e40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
15e50 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
15e60 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
15e70 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
15e80 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
15e90 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
15ea0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
15eb0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
15ec0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
15ed0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
15ee0 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
15ef0 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
15f00 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
15f10 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
15f20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15f30 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
15f40 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15f50 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
15f60 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
15f70 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
15f80 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
15f90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15fa0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
15fb0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15fc0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15fd0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
15fe0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
15ff0 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
16000 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
16010 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
16020 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
16030 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
16040 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
16050 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
16060 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
16070 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
16080 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
16090 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
160a0 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
160b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
160c0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
160d0 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
160e0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
160f0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
16100 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
16110 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
16120 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
16130 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
16140 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
16150 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
16160 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
16170 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
16180 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
16190 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
161a0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
161b0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
161c0 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
161d0 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
161e0 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
161f0 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
16200 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
16210 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16220 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16230 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
16240 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
16250 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
16260 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
16270 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
16280 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
16290 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
162a0 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
162b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
162c0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
162d0 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
162e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
162f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
16300 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
16310 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
16320 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
16330 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
16340 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
16350 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
16360 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
16370 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
16380 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
16390 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
163a0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
163b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
163c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
163d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
163e0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
163f0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16400 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
16410 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
16420 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
16430 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16440 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
16450 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
16460 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
16470 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
16480 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
16490 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
164a0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
164b0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
164c0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
164d0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
164e0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
164f0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
16500 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
16510 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
16520 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
16530 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
16540 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
16550 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
16560 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
16570 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
16580 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
16590 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
165a0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
165b0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
165c0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
165d0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
165e0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
165f0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
16600 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
16610 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
16620 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
16630 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
16640 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
16650 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
16660 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
16670 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
16680 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
16690 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
166a0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
166b0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
166c0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
166d0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
166e0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
166f0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
16700 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16710 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
16720 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
16730 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
16740 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
16750 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
16760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16770 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
16780 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16790 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
167a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
167b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
167c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
167d0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
167e0 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
167f0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
16800 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16810 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
16820 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16830 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16840 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
16850 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16860 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
16870 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
16880 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
16890 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
168a0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
168b0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
168c0 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
168d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
168e0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
168f0 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
16900 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
16910 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
16920 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
16930 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16940 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16950 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16960 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
16970 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
16980 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
16990 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
169a0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
169b0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
169c0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
169d0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
169e0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
169f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16a00 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16a10 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16a20 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16a30 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16a40 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16a50 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16a60 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16a70 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
16a80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16a90 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
16aa0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
16ab0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
16ac0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
16ad0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
16ae0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
16af0 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16b00 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16b10 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16b20 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
16b30 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
16b40 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
16b50 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
16b60 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
16b70 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
16b80 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
16b90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
16ba0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
16bb0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16bc0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16be0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
16bf0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16c00 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
16c10 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16c20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16c30 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16c40 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
16c50 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
16c60 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16c70 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
16c80 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
16c90 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16ca0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
16cb0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
16cc0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
16cd0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
16ce0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
16cf0 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
16d00 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
16d10 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
16d20 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
16d30 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
16d40 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
16d50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16d60 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
16d70 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
16d80 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16d90 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
16da0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
16db0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
16dc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16dd0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
16de0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16df0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
16e00 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
16e10 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
16e20 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16e30 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
16e40 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
16e50 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
16e60 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
16e70 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
16e80 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
16e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
16ea0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
16eb0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16ec0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
16ed0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
16ee0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16ef0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
16f00 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
16f10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
16f20 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16f30 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
16f40 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
16f50 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
16f60 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16f70 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
16f80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16f90 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
16fa0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
16fb0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
16fc0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
16fd0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16fe0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
16ff0 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
17000 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
17010 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
17020 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
17030 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
17040 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
17050 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
17060 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
17070 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
17080 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
17090 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
170a0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
170b0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
170c0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
170d0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
170e0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
170f0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
17100 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
17110 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
17120 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17130 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
17140 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
17150 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
17160 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
17170 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
17180 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
171a0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
171b0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
171c0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
171d0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
171e0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
171f0 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
17200 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
17210 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
17220 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17230 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
17240 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
17250 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
17260 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
17270 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
17280 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
17290 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
172a0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
172b0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
172c0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
172d0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
172e0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
172f0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
17300 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
17310 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
17320 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
17330 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
17340 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
17350 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
17360 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
17370 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
17380 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
17390 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
173a0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
173b0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
173c0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
173d0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
173e0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
173f0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
17400 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17410 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17420 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
17430 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17440 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
17450 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
17460 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
17470 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
17480 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
17490 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
174a0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
174b0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
174c0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
174d0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
174e0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
174f0 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
17500 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
17510 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
17520 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
17530 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
17540 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17550 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
17560 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
17570 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
17580 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
17590 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
175a0 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
175b0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
175c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
175d0 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
175e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
175f0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
17600 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
17610 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
17620 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
17630 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
17640 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17650 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17660 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
17670 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
17680 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
17690 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
176a0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
176b0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
176c0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
176d0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
176e0 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
176f0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
17700 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17720 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
17730 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
17740 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
17750 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
17760 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
17770 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
17780 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
17790 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
177a0 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
177b0 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
177c0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
177d0 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
177e0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
177f0 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
17800 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
17810 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17820 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
17830 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
17840 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
17850 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
17860 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
17870 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17880 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
17890 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
178a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
178b0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
178c0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
178d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
178e0 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
178f0 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
17900 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
17910 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
17920 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
17930 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
17940 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
17950 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
17960 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
17970 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
17980 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
17990 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
179a0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
179b0 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
179c0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
179d0 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
179e0 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
179f0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17a00 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17a10 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
17a20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
17a30 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
17a40 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17a50 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
17a60 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
17a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17a80 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
17a90 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
17aa0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
17ab0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
17ac0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17ad0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17ae0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17af0 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
17b20 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
17b30 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
17b40 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
17b50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17b60 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
17b90 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
17ba0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
17bb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
17bc0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
17bd0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
17be0 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
17bf0 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
17c00 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
17c10 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
17c20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17c30 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
17c40 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
17c50 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
17c60 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
17c70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17c80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
17c90 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
17ca0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17cb0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
17cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17cd0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
17ce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17cf0 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
17d00 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
17d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17d30 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
17d40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17d50 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
17d60 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17d70 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
17d80 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
17d90 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17da0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
17db0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
17dc0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
17dd0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
17de0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
17df0 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
17e00 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
17e10 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
17e20 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
17e30 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
17e40 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
17e50 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
17e60 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
17e70 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
17e80 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
17e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17ea0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
17eb0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
17ec0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
17ed0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
17ee0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
17ef0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17f00 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
17f10 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
17f20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17f30 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
17f40 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
17f50 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
17f60 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
17f70 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
17f80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17f90 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
17fa0 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
17fb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17fc0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
17fd0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17fe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
17ff0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18000 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
18010 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
18020 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
18030 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
18040 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
18050 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
18060 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
18070 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
18080 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
18090 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
180a0 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
180b0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
180c0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
180d0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
180e0 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
180f0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
18100 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
18110 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
18120 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
18130 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
18140 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
18150 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
18160 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
18170 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
18180 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
18190 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
181a0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
181b0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
181c0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
181d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
181e0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
181f0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
18200 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
18210 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
18220 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
18230 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18240 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
18250 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
18260 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
18270 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
18280 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
18290 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
182a0 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
182b0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
182c0 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
182d0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
182e0 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  );.    .#ifdef S
182f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
18300 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
18310 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
18320 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
18330 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
18340 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
18350 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
18360 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
18370 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
18380 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
18390 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
183a0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
183b0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
183c0 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
183d0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
183e0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
183f0 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
18400 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
18410 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
18420 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
18430 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
18440 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
18450 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
18460 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
18470 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
18480 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
18490 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
184a0 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
184b0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
184c0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
184d0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
184e0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
184f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18500 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
18510 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18520 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
18530 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
18540 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
18550 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
18560 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
18570 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18580 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18590 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
185a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
185b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
185c0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
185d0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
185e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
185f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
18600 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18610 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
18620 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
18630 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
18640 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
18650 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
18660 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
18670 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
18680 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
18690 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
186a0 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
186b0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
186c0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
186d0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
186e0 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
186f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
18700 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
18710 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
18720 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18730 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
18740 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
18750 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
18760 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
18770 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
18780 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
18790 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
187a0 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
187b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
187c0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
187d0 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
187e0 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
187f0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
18800 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18810 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18820 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
18830 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18840 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
18850 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
18860 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
18870 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18890 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
188a0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
188b0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
188c0 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
188d0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
188e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
188f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
18900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
18910 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
18920 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
18930 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
18940 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
18950 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
18960 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
18970 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
18980 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
18990 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
189a0 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
189b0 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
189c0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
189d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
189e0 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
189f0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
18a00 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18a10 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
18a20 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
18a30 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
18a40 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
18a50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18a60 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
18a70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18a80 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
18a90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18aa0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
18ab0 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
18ac0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
18ad0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18ae0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18af0 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
18b00 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
18b10 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
18b20 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
18b30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18b40 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
18b50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18b60 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
18b70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18b90 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
18ba0 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
18bb0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
18bc0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
18bd0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
18be0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
18bf0 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
18c00 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  (pFile);.      }
18c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
18c20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
18c30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18c40 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
18c50 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
18c60 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
18c70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
18c80 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
18c90 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
18ca0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
18cb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
18cc0 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
18cd0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
18ce0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18cf0 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
18d00 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18d10 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18d20 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
18d30 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
18d40 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
18d50 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
18d60 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
18d70 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
18d80 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
18d90 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
18da0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
18db0 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
18dc0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
18dd0 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
18de0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
18df0 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
18e00 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
18e10 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
18e20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
18e30 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
18e40 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
18e50 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
18e60 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
18e70 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
18e80 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
18e90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
18ea0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
18eb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
18ec0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
18ed0 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ile);.    sqlite
18ee0 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
18ef0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
18f00 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
18f10 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
18f20 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18f30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18f40 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
18f50 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18f60 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18f70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18f80 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
18f90 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
18fa0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
18fb0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
18fc0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
18fd0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
18fe0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
18ff0 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
19000 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
19010 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
19020 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
19030 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
19040 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
19050 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
19060 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
19070 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
19080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
19090 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
190a0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
190b0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
190c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
190d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19110 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
19120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19160 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
19170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19180 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
19190 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
191a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191b0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
191c0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
191d0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
191e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
191f0 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
19200 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19210 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
19220 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
19230 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
19240 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
19250 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
19260 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
19270 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
19280 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
19290 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
192a0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
192b0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
192c0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
192d0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
192e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
192f0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
19300 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
19310 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19320 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
19330 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
19340 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
19350 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   1);.}..#endif /
19360 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
19370 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
19380 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
19390 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
193a0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
193b0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
193c0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
193d0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
193e0 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
193f0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
19400 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
19410 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
19420 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
19430 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a  available.  .**.
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19450 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
19460 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
19470 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
19480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
194e0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
194f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19530 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19540 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71  * Non-locking sq
19550 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
19560 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
19570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19580 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
19590 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
195a0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
195b0 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64  s for all method
195c0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s of the .** sql
195d0 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74  ite3_file object
195e0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
195f0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e  locking methods.
19600 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a    The locking.**
19610 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65   methods were de
19620 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f  fined in divisio
19630 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f  ns above (one lo
19640 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72  cking method per
19650 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20  .** division).  
19660 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68  Those methods th
19670 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f  at are common to
19680 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64   all locking mod
19690 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72  es.** are gather
196a0 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74   together into t
196b0 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  his division..*/
196c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
196d0 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65  the offset passe
196e0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
196f0 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72  argument, then r
19700 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65  ead cnt .** byte
19710 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74  s into pBuf. Ret
19720 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19730 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
19740 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a   read..**.** NB:
19750 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20    If you define 
19760 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45  USE_PREAD or USE
19770 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69  _PREAD64, then i
19780 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20  t might also.** 
19790 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
197a0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
197b0 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20  URCE to be 500. 
197c0 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f   This varies fro
197d0 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20  m.** one system 
197e0 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e  to another.  Sin
197f0 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  ce SQLite does n
19800 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ot define USE_PR
19810 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66  EAD.** any any f
19820 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
19830 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
19840 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
19850 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
19860 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
19870 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
19880 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
19890 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
198a0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
198b0 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
198c0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
198d0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
198e0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
198f0 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
19900 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
19910 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
19920 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
19930 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19940 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
19950 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
19960 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
19970 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
19980 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
19990 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
199a0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
199b0 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
199c0 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
199d0 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
199e0 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  2 );.  cnt &= 0x
199f0 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
19a00 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19a10 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
19a20 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
19a30 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19a40 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19a50 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19a60 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19a70 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
19a80 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
19a90 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19aa0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19ab0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19ac0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19ad0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19ae0 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19af0 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19b00 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19b10 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19b20 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
19b30 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
19b40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
19b50 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
19b60 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
19b70 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
19b80 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
19b90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19ba0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
19bb0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
19bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19bd0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
19be0 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61  .    got = osRea
19bf0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
19c00 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nt);.#endif.    
19c10 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62  if( got==cnt ) b
19c20 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f  reak;.    if( go
19c30 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  t<0 ){.      if(
19c40 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b   errno==EINTR ){
19c50 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e   got = 1; contin
19c60 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f  ue; }.      prio
19c70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75  r = 0;.      ((u
19c80 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
19c90 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
19ca0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19cb0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
19cc0 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
19cd0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
19ce0 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
19cf0 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
19d00 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
19d10 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
19d20 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
19d30 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
19d40 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
19d50 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
19d60 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
19d70 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
19d80 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
19d90 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
19da0 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
19db0 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
19dc0 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
19dd0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
19de0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
19df0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
19e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
19e10 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
19e20 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
19e30 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
19e40 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
19e50 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
19e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19e70 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
19e80 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
19e90 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
19ea0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
19eb0 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
19ec0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
19ed0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
19ee0 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
19ef0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
19f00 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
19f10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19f20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
19f30 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
19f40 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
19f50 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
19f60 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
19f70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
19f80 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
19f90 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
19fa0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
19fb0 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
19fc0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
19fd0 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
19fe0 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
19ff0 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1a000 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1a010 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1a020 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1a030 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1a040 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1a050 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1a060 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1a070 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
1a080 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1a090 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1a0a0 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1a0b0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1a0c0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1a0d0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1a0e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a0f0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1a100 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1a110 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1a120 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
1a130 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1a140 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1a150 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1a160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1a180 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1a190 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1a1a0 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1a1b0 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1a1c0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1a1d0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
1a1e0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1a1f0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1a200 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1a210 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1a220 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1a230 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1a240 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
1a250 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1a260 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1a270 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
1a280 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
1a290 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1a2a0 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
1a2b0 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
1a2c0 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1a2d0 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
1a2e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a2f0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1a300 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1a310 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74  rrno = 0; /* not
1a320 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
1a330 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
1a340 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
1a350 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
1a360 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
1a370 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
1a380 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
1a390 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
1a3a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a3b0 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1a3c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1a3d0 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
1a3e0 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
1a3f0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1a400 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
1a410 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
1a420 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
1a430 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
1a440 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1a450 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
1a460 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
1a470 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
1a480 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
1a490 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
1a4a0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
1a4b0 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
1a4c0 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
1a4d0 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
1a4e0 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
1a4f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1a500 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
1a510 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a530 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1a540 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1a550 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1a580 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1a590 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1a5a0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1a5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a5c0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1a5d0 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1a5e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1a5f0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1a600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a610 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1a620 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1a630 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a650 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1a660 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1a670 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1a680 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1a690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1a6a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1a6b0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1a6c0 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1a6d0 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1a6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1a6f0 32 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30  2 );.  nBuf &= 0
1a700 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
1a710 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69  START;..#if defi
1a720 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1a730 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69   do{ rc = osPwri
1a740 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
1a750 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65  f, iOff); }while
1a760 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
1a770 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20  =EINTR );.#elif 
1a780 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1a790 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20  D64).  do{ rc = 
1a7a0 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70  osPwrite64(fd, p
1a7b0 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1a7c0 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26  ;}while( rc<0 &&
1a7d0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
1a7e0 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
1a7f0 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65  i64 iSeek = lsee
1a800 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b  k(fd, iOff, SEEK
1a810 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
1a820 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65  ateIOError( iSee
1a830 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  k-- );..    if( 
1a840 69 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20  iSeek!=iOff ){. 
1a850 20 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f       if( piErrno
1a860 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69   ) *piErrno = (i
1a870 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f  Seek==-1 ? errno
1a880 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74   : 0);.      ret
1a890 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
1a8a0 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1a8b0 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1a8c0 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1a8d0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1a8e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1a8f0 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1a900 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1a910 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1a920 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1a930 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1a940 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  ;..  if( rc<0 &&
1a950 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72   piErrno ) *piEr
1a960 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1a970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a980 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1a990 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1a9a0 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1a9b0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1a9c0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1a9d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a9e0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1a9f0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1aa00 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1aa10 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1aa20 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1aa30 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1aa40 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1aa50 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1aa60 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1aa70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1aa80 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1aa90 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1aaa0 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1aab0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1aac0 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1aad0 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1aae0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1aaf0 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1ab00 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1ab10 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1ab20 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1ab30 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1ab40 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1ab50 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1ab60 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1ab70 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1ab80 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1ab90 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1aba0 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1abb0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1abc0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1abd0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1abe0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1abf0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1ac00 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1ac10 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1ac20 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1ac30 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1ac40 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1ac50 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1ac60 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1ac70 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1ac80 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1ac90 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1aca0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1acb0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1acc0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1acd0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1ace0 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1acf0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1ad00 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1ad10 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1ad20 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1ad30 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1ad40 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1ad50 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1ad60 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1ad70 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1ad80 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1ad90 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1ada0 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1adb0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1adc0 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1add0 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1ade0 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1adf0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1ae00 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1ae10 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1ae20 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1ae30 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1ae40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1ae50 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1ae60 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1ae70 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1ae80 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1ae90 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1aea0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1aeb0 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1aec0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1aed0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1aee0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1aef0 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1af00 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1af10 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1af20 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1af30 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1af40 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1af50 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1af60 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1af70 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1af80 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1af90 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1afa0 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1afb0 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1afc0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1afd0 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1afe0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1aff0 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1b000 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1b010 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1b020 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1b030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b040 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1b050 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1b060 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1b070 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1b080 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
1b090 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1b0a0 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1b0b0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1b0c0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1b0d0 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1b0e0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1b0f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1b100 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1b110 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1b120 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1b130 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1b140 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1b150 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1b160 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
1b170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b180 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1b190 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1b1a0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1b1b0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1b1c0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1b1d0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1b1e0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1b1f0 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
1b200 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1b210 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1b220 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1b230 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1b240 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1b250 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
1b260 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
1b270 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
1b280 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
1b290 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
1b2a0 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1b2b0 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
1b2c0 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
1b2d0 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
1b2e0 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
1b2f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b300 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
1b310 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
1b320 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1b330 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
1b340 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
1b350 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
1b360 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1b370 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1b380 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1b390 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1b3a0 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1b3b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b3c0 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1b3d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b3e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1b3f0 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61  no = 0; /* not a
1b400 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f   system error */
1b410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b420 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1b430 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1b440 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1b450 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1b460 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1b470 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
1b480 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
1b490 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
1b4a0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
1b4b0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
1b4c0 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
1b4d0 72 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  rring at the rig
1b4e0 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
1b4f0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1b500 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
1b510 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1b520 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
1b530 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  ./*.** We do not
1b540 20 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74   trust systems t
1b550 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b  o provide a work
1b560 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e  ing fdatasync().
1b570 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74    Some do..** Ot
1b580 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20  hers do no.  To 
1b590 62 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c  be safe, we will
1b5a0 20 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20   stick with the 
1b5b0 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72  (slightly slower
1b5c0 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66  ).** fsync(). If
1b5d0 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79   you know that y
1b5e0 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20  our system does 
1b5f0 73 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e  support fdatasyn
1b600 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a  c() correctly,.*
1b610 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f  * then simply co
1b620 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61  mpile with -Dfda
1b630 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63  tasync=fdatasync
1b640 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1b650 28 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65  (fdatasync).# de
1b660 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1b670 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1b680 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1b690 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1b6a0 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1b6b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1b6c0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1b6d0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1b6e0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1b6f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1b700 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1b710 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1b720 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1b730 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1b740 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1b750 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b760 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1b770 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b780 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
1b790 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1b7a0 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1b7b0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1b7c0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1b7d0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1b7e0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1b7f0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1b800 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1b810 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1b820 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1b830 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1b840 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1b850 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1b860 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1b870 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1b880 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1b890 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1b8a0 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1b8b0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1b8c0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1b8d0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1b8e0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1b8f0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1b900 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1b910 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1b920 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1b930 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1b940 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1b950 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1b960 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1b970 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1b980 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1b990 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1b9a0 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1b9b0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1b9c0 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1b9d0 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1b9e0 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1b9f0 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1ba00 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1ba10 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1ba20 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1ba30 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1ba40 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1ba50 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1ba60 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1ba70 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1ba80 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1ba90 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1baa0 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1bab0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1bac0 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1bad0 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1bae0 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1baf0 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1bb00 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1bb10 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1bb20 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1bb30 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1bb40 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1bb50 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1bb60 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1bb70 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1bb80 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1bb90 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1bba0 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1bbb0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1bbc0 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1bbd0 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1bbe0 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1bbf0 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1bc00 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1bc10 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1bc20 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1bc30 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1bc40 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1bc50 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1bc60 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1bc70 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1bc80 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1bc90 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1bca0 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1bcb0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1bcc0 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1bcd0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1bce0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1bcf0 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1bd00 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1bd10 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1bd20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1bd30 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1bd40 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1bd50 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1bd60 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1bd70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1bd80 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1bd90 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1bda0 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1bdb0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1bdc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bdd0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1bde0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1bdf0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1be00 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1be10 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1be20 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1be30 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1be40 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1be50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1be60 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1be70 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1be80 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1be90 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1bea0 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1beb0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1bec0 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1bed0 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1bee0 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1bef0 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1bf00 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1bf10 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1bf20 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1bf30 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1bf40 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1bf50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1bf60 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1bf70 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1bf80 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1bf90 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1bfa0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1bfb0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1bfc0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1bfd0 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1bfe0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1bff0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1c000 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1c010 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1c020 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1c030 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1c040 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1c050 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1c060 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1c070 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c080 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1c090 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1c0a0 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1c0b0 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1c0c0 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1c0d0 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1c0e0 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1c0f0 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1c100 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1c110 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1c120 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1c130 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1c140 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1c150 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1c160 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1c170 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1c180 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1c190 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1c1a0 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1c1b0 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1c1c0 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1c1d0 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1c1e0 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1c1f0 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1c200 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1c210 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1c220 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1c230 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1c240 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1c250 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1c260 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1c270 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1c280 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1c290 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1c2a0 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1c2b0 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1c2c0 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1c2d0 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1c2e0 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1c2f0 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1c300 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1c310 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1c320 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1c330 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1c340 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1c350 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1c360 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1c370 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1c380 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1c390 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1c3a0 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1c3b0 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1c3c0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1c3d0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1c3e0 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1c3f0 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1c400 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1c410 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1c420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1c430 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1c440 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1c450 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1c460 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1c470 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1c480 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1c490 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1c4a0 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1c4b0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1c4c0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1c4d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1c4e0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1c4f0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1c500 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1c510 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1c520 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1c530 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1c540 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1c550 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c560 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1c570 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1c580 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1c590 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1c5a0 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1c5b0 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1c5c0 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1c5d0 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1c5e0 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1c5f0 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1c600 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1c610 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1c620 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1c630 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1c640 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1c650 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1c660 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1c670 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1c680 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1c690 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1c6a0 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1c6b0 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1c6c0 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1c6d0 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1c6e0 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1c6f0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1c700 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1c710 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1c720 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1c730 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1c740 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1c750 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1c760 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1c770 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1c780 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1c790 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1c7a0 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1c7b0 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1c7c0 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1c7d0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1c7e0 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1c7f0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1c800 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1c810 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c820 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1c830 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1c840 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1c850 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c860 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1c870 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1c880 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1c890 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1c8a0 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1c8b0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1c8c0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1c8d0 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1c8e0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1c8f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1c900 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1c910 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1c920 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1c930 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1c940 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1c950 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1c960 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1c970 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1c980 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1c990 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  0';.    fd = rob
1c9a0 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  ust_open(zDirnam
1c9b0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1c9c0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1c9d0 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
1c9e0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1c9f0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1ca00 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1ca10 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1ca20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1ca30 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1ca40 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1ca50 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1ca60 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
1ca70 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
1ca80 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1ca90 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1caa0 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1cab0 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1cac0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1cad0 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1cae0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1caf0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1cb00 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1cb10 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1cb20 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1cb30 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1cb40 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1cb50 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1cb60 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1cb70 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1cb80 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1cb90 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1cba0 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1cbb0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1cbc0 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1cbd0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1cbe0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1cbf0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1cc00 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1cc10 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1cc20 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1cc30 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1cc40 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1cc50 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1cc60 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1cc70 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1cc80 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1cc90 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1cca0 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1ccb0 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1ccc0 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1ccd0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1cce0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1ccf0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1cd00 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1cd10 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1cd20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1cd30 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1cd40 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1cd50 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1cd60 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1cd70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1cd80 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1cd90 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1cda0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1cdb0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1cdc0 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1cdd0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1cde0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1cdf0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1ce00 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1ce10 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1ce20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1ce30 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1ce40 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1ce50 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1ce60 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1ce70 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1ce80 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1ce90 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1cea0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1ceb0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1cec0 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1ced0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1cee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1cef0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1cf00 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1cf10 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1cf20 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1cf30 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1cf40 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1cf50 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1cf60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1cf70 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1cf80 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1cf90 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1cfa0 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1cfb0 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1cfc0 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1cfd0 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1cfe0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1cff0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1d000 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1d010 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1d020 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1d030 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1d040 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1d050 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1d060 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1d070 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Path);.  }..  /*
1d080 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20   Also fsync the 
1d090 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1d0a0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66  ning the file if
1d0b0 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61   the DIRSYNC fla
1d0c0 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20  g.  ** is set.  
1d0d0 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69  This is a one-ti
1d0e0 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20  me occurrence.  
1d0f0 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78  Many systems (ex
1d100 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a  amples: AIX).  *
1d110 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  * are unable to 
1d120 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72  fsync a director
1d130 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72  y, so ignore err
1d140 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63  ors on the fsync
1d150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1d160 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1d170 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1d180 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66   ){.    int dirf
1d190 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  d;.    OSTRACE((
1d1a0 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76  "DIRSYNC %s (hav
1d1b0 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
1d1c0 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
1d1d0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20  pFile->zPath,.  
1d1e0 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
1d1f0 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
1d200 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d  sync));.    rc =
1d210 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
1d220 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
1d230 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
1d240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d250 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20   dirfd>=0 ){.   
1d260 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1d270 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rfd, 0, 0);.    
1d280 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1d290 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1d2a0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
1d2b0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1d2c0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
1d2d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d2e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  K;.    }.    pFi
1d2f0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
1d300 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59   ~UNIXFILE_DIRSY
1d310 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NC;.  }.  return
1d320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
1d330 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
1d340 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
1d350 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
1d360 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
1d370 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
1d380 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
1d390 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1d3a0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
1d3b0 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )id;.  int rc;. 
1d3c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1d3d0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1d3e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1d3f0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1d400 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
1d410 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
1d420 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
1d430 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
1d440 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1d450 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
1d460 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
1d470 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
1d480 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
1d490 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
1d4a0 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
1d4b0 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
1d4c0 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
1d4d0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1d4e0 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
1d4f0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1d500 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1d510 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
1d520 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
1d530 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
1d540 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1d550 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72  zChunk;.  }..  r
1d560 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  c = robust_ftrun
1d570 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28  cate(pFile->h, (
1d580 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
1d590 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
1d5a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1d5b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1d5c0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1d5d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1d5e0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1d5f0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1d600 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  );.  }else{.#ifd
1d610 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d620 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1d630 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
1d640 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
1d650 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
1d660 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64  osed to.    ** d
1d670 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1d680 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1d690 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1d6a0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1d6b0 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64  .    ** normal d
1d6c0 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e  atabase file) an
1d6d0 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68  d we truncate th
1d6e0 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1d6f0 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68  ength,.    ** th
1d700 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75  at effectively u
1d710 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1d720 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  e counter.  This
1d730 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20   might happen.  
1d740 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72    ** when restor
1d750 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75  ing a database u
1d760 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
1d770 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  API from a zero-
1d780 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f  length.    ** so
1d790 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  urce..    */.   
1d7a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1d7b0 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79  rmalWrite && nBy
1d7c0 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  te==0 ){.      p
1d7d0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1d7e0 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  hng = 1;.    }.#
1d7f0 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1d800 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1d810 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  0.    /* If the 
1d820 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72  file was just tr
1d830 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a  uncated to a siz
1d840 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
1d850 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20  he currently.   
1d860 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f   ** mapped regio
1d870 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66  n, reduce the ef
1d880 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20  fective mapping 
1d890 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51  size as well. SQ
1d8a0 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Lite will.    **
1d8b0 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20   use read() and 
1d8c0 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73  write() to acces
1d8d0 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68  s data beyond th
1d8e0 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f  is point from no
1d8f0 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  w on.  .    */. 
1d900 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69     if( nByte<pFi
1d910 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1d920 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1d930 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20  pSize = nByte;. 
1d940 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1d950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d960 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
1d970 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1d980 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1d990 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1d9a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d9b0 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
1d9c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
1d9d0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1d9e0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
1d9f0 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
1da00 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  d );.  rc = osFs
1da10 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29  tat(((unixFile*)
1da20 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  id)->h, &buf);. 
1da30 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1da40 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
1da50 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75  rc!=0 ){.    ((u
1da60 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
1da70 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1da80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1da90 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1daa0 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
1dab0 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
1dac0 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1dad0 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
1dae0 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f  ase, the findIno
1daf0 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  deInfo() procedu
1db00 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
1db10 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
1db20 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
1db30 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
1db40 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
1db50 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
1db60 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
1db70 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1db80 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
1db90 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
1dba0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
1dbb0 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
1dbc0 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
1dbd0 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
1dbe0 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
1dbf0 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
1dc00 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
1dc10 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
1dc20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dc30 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
1dc40 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1dc50 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1dc60 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
1dc70 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70  ** Handler for p
1dc80 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c  roxy-locking fil
1dc90 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e  e-control verbs.
1dca0 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20    Defined below 
1dcb0 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69  in the.** proxyi
1dcc0 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73  ng locking divis
1dcd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1dce0 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
1dcf0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1dd00 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65  *,int,void*);.#e
1dd10 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  ndif../* .** Thi
1dd20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1dd30 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  lled to handle t
1dd40 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
1dd50 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69  SIZE_HINT .** fi
1dd60 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61  le-control opera
1dd70 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74  tion.  Enlarge t
1dd80 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e  he database to n
1dd90 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a  Bytes in size.**
1dda0 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20   (rounded up to 
1ddb0 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73  the next chunk-s
1ddc0 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61  ize).  If the da
1ddd0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1dde0 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c  y.** nBytes or l
1ddf0 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74  arger, this rout
1de00 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1de10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63  */.static int fc
1de20 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78  ntlSizeHint(unix
1de30 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34  File *pFile, i64
1de40 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70   nByte){.  if( p
1de50 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1de60 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65  ){.    i64 nSize
1de70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de80 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
1de90 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1dea0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1deb0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1dec0 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20  /* Used to hold 
1ded0 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  return values of
1dee0 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a   fstat() */.   .
1def0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1df00 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  pFile->h, &buf) 
1df10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1df20 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20  IOERR_FSTAT;..  
1df30 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1df40 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1df50 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1df60 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1df70 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1df80 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1df90 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1dfa0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1dfb0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1dfc0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1dfd0 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1dfe0 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1dff0 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1e000 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1e010 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1e020 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1e030 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1e040 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1e050 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1e060 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1e070 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1e080 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1e090 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1e0a0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1e0b0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1e0c0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1e0d0 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1e0e0 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1e0f0 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1e100 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1e110 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1e120 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1e130 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1e140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e150 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1e160 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1e170 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1e180 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1e190 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72  (), fake it. Fir
1e1a0 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  st use.      ** 
1e1b0 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73  ftruncate() to s
1e1c0 65 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  et the file size
1e1d0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73  , then write a s
1e1e0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20  ingle byte to.  
1e1f0 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
1e200 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f  byte in each blo
1e210 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ck within the ex
1e220 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54  tended region. T
1e230 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
1e240 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71  the same techniq
1e250 75 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63  ue used by glibc
1e260 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f   to implement po
1e270 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a  six_fallocate().
1e280 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74        ** on syst
1e290 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ems that do not 
1e2a0 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c  have a real fall
1e2b0 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63  ocate() system c
1e2c0 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  all..      */.  
1e2d0 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62      int nBlk = b
1e2e0 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20  uf.st_blksize;  
1e2f0 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62  /* File-system b
1e300 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20  lock size */.   
1e310 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20     i64 iWrite;  
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e330 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f  * Next offset to
1e340 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20   write to */..  
1e350 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
1e360 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1e370 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20  h, nSize) ){.   
1e380 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1e390 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1e3a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e         return un
1e3b0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1e3c0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1e3d0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1e3e0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1e3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69      }.      iWri
1e400 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69  te = ((buf.st_si
1e410 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29  ze + 2*nBlk - 1)
1e420 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20  /nBlk)*nBlk-1;. 
1e430 20 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 69       while( iWri
1e440 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20  te<nSize ){.    
1e450 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d      int nWrite =
1e460 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
1e470 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c  ile, iWrite, "",
1e480 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
1e490 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74   nWrite!=1 ) ret
1e4a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1e4b0 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20  _WRITE;.        
1e4c0 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a  iWrite += nBlk;.
1e4d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e4e0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51     }.  }..#if SQ
1e4f0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1e500 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65  ZE>0.  if( pFile
1e510 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
1e520 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e  && nByte>pFile->
1e530 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1e540 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
1e550 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d  pFile->szChunk<=
1e560 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  0 ){.      if( r
1e570 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1e580 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1e590 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1e5a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1e5b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
1e5c0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1e5d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1e5e0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1e5f0 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1e600 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1e610 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   }..    rc = uni
1e620 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  xMapfile(pFile, 
1e630 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75  nByte);.    retu
1e640 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1e650 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  f..  return SQLI
1e660 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e670 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74  If *pArg is init
1e680 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
1e690 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
1e6a0 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
1e6b0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
1e6c0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1e6d0 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
1e6e0 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
1e6f0 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
1e700 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
1e710 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
1e720 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
1e730 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
1e740 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
1e750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1e760 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c  xModeBit(unixFil
1e770 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
1e780 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
1e790 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
1e7a0 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
1e7b0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
1e7c0 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
1e7d0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
1e7e0 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
1e7f0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1e800 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
1e810 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1e820 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
1e830 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
1e840 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1e850 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
1e860 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
1e870 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1e880 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49  *zBuf);../*.** I
1e890 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1e8a0 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
1e8b0 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1e8c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e8d0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
1e8e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1e8f0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1e900 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
1e910 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1e920 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
1e930 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1e940 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1e950 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1e960 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1e970 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
1e980 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e990 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e9a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
1e9b0 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
1e9c0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1e9d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e9e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e9f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ea00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ea10 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
1ea20 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
1ea30 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74  >szChunk = *(int
1ea40 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72   *)pArg;.      r
1ea50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ea60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ea70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1ea80 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
1ea90 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69  int rc;.      Si
1eaa0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1eab0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1eac0 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74   = fcntlSizeHint
1ead0 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29  (pFile, *(i64 *)
1eae0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d  pArg);.      Sim
1eaf0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1eb00 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74  gn(0);.      ret
1eb10 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1eb20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1eb30 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
1eb40 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
1eb50 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
1eb60 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
1eb70 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
1eb80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1eb90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1eba0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ebb0 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TL_POWERSAFE_OVE
1ebc0 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  RWRITE: {.      
1ebd0 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
1ebe0 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  e, UNIXFILE_PSOW
1ebf0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
1ec00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ec10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1ec20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ec30 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
1ec40 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1ec50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
1ec60 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d  ntf("%s", pFile-
1ec70 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pVfs->zName);. 
1ec80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ec90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1eca0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ecb0 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
1ecc0 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
1ecd0 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  TFile = sqlite3_
1ece0 6d 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70  malloc( pFile->p
1ecf0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1ed00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46  );.      if( zTF
1ed10 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ile ){.        u
1ed20 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  nixGetTempname(p
1ed30 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1ed40 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b  thname, zTFile);
1ed50 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
1ed60 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
1ed70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ed80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ed90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1eda0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
1edb0 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20  _MOVED: {.      
1edc0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69  *(int*)pArg = fi
1edd0 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
1ede0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1edf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ee00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1ee10 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
1ee20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ee30 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
1ee40 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
1ee50 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
1ee60 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1ee70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1ee80 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
1ee90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1eea0 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
1eeb0 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
1eec0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1eed0 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
1eee0 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29   }.      *(i64*)
1eef0 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  pArg = pFile->mm
1ef00 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20  apSizeMax;.     
1ef10 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
1ef20 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46   && newLimit!=pF
1ef30 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1ef40 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63   && pFile->nFetc
1ef50 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hOut==0 ){.     
1ef60 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1ef70 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74  zeMax = newLimit
1ef80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
1ef90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20  ile->mmapSize>0 
1efa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  ){.          uni
1efb0 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
1efc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1efd0 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
1efe0 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
1eff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f010 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
1f020 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f030 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
1f040 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
1f050 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
1f060 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
1f070 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
1f080 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
1f090 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
1f0a0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
1f0b0 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
1f0c0 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1f0d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
1f0e0 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
1f0f0 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
1f100 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
1f110 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f120 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
1f130 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1f140 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
1f150 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1f160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f170 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
1f180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1f190 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1f1a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1f1b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f1c0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1f1d0 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
1f1e0 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
1f1f0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1f200 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1f210 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1f220 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1f230 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1f240 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1f250 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1f260 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
1f270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1f280 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1f290 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1f2a0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1f2b0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1f2c0 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1f2d0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1f2e0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1f2f0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1f300 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1f310 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1f320 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1f330 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1f340 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1f350 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1f360 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1f370 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1f380 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1f390 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1f3a0 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1f3b0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1f3c0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1f3d0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1f3e0 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1f3f0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1f400 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1f410 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  both..*/.#ifndef
1f420 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61   __QNXNTO__ .sta
1f430 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1f440 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1f450 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
1f460 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f470 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1f480 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1f490 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1f4a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f4b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1f4c0 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65  ersion of unixSe
1f4d0 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70  ctorSize() is op
1f4e0 74 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e  timized for QNX.
1f4f0 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58  .*/.#ifdef __QNX
1f500 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c  NTO__.#include <
1f510 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a  sys/dcmd_blk.h>.
1f520 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
1f530 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20  atvfs.h>.static 
1f540 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1f550 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1f560 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
1f570 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1f580 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
1f590 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f5a0 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72   == 0 ){.    str
1f5b0 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e  uct statvfs fsIn
1f5c0 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20  fo;.       .    
1f5d0 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20  /* Set defaults 
1f5e0 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65  for non-supporte
1f5f0 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f  d filesystems */
1f600 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
1f610 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
1f620 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1f630 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  IZE;.    pFile->
1f640 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f650 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69  stics = 0;.    i
1f660 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c  f( fstatvfs(pFil
1f670 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  e->h, &fsInfo) =
1f680 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72  = -1 ) {.      r
1f690 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
1f6a0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  torSize;.    }..
1f6b0 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
1f6c0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f6d0 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20  e, "tmp") ) {.  
1f6e0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f6f0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f700 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f710 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f720 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f730 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f740 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20  P_ATOMIC4K |    
1f750 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69     /* All ram fi
1f760 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
1f770 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1f780 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f790 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1f7a0 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1f7b0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1f7c0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1f800 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1f810 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f820 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1f830 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1f840 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1f850 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1f890 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1f8a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f8b0 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
1f8c0 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66  f_basetype, "etf
1f8d0 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1f8e0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f8f0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f900 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f910 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f920 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1f930 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69   etfs cluster si
1f940 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74  ze writes are at
1f950 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1f960 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1f970 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1f980 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1f990 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  2) |.        SQL
1f9a0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1f9b0 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1f9c0 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1f9d0 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1f9e0 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1fa10 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1fa20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fa30 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1fa40 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1fa50 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1fa60 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1fa70 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1faa0 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1fab0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1fac0 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
1fad0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1fae0 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20  pe, "qnx6") ){. 
1faf0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1fb00 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1fb10 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1fb20 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1fb30 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1fb40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fb50 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20  AP_ATOMIC |     
1fb60 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
1fb70 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
1fb80 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1fb90 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fba0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1fbb0 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1fbc0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1fbd0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1fc10 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1fc20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1fc30 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1fc40 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1fc50 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1fc60 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1fc90 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1fca0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1fcb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
1fcc0 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1fcd0 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22  basetype, "qnx4"
1fce0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1fcf0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1fd00 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1fd10 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1fd20 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fd30 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1fd40 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1fd50 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1fd60 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1fd70 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1fd80 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1fd90 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1fda0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fdb0 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1fdc0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1fdd0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1fde0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1fdf0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1fe00 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1fe10 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1fe40 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1fe50 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1fe60 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
1fe70 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1fe80 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20  , "dos") ){.    
1fe90 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fea0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1feb0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1fec0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fed0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1fee0 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
1fef0 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
1ff00 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
1ff10 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
1ff20 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
1ff30 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1ff40 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1ff50 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
1ff60 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
1ff70 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1ff80 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1ff90 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1ffa0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1ffb0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ffe0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1fff0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
20000 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20010 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20020 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20030 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
20040 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20  IOCAP_ATOMIC512 
20050 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73  |      /* blocks
20060 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
20070 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20080 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
20090 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
200a0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
200b0 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
200f0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
20100 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20       0;.    }.  
20110 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e  }.  /* Last chan
20120 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e  ce verification.
20130 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20    If the sector 
20140 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c  size isn't a mul
20150 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a  tiple of 512.  *
20160 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20  * then it isn't 
20170 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70  valid.*/.  if( p
20180 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20190 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20   % 512 != 0 ){. 
201a0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
201b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
201c0 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
201d0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
201e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
201f0 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
20200 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
20210 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  torSize;.}.#endi
20220 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  f /* __QNXNTO__ 
20230 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
20240 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
20250 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
20260 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
20270 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20  This VFS is set 
20280 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  up to return SQL
20290 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
202a0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79  AFE_OVERWRITE by
202b0 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77   default..** How
202c0 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63  ever, that choic
202d0 65 20 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69  e is contraversi
202e0 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63  al since technic
202f0 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79  ally the underly
20300 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74  ing.** file syst
20310 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61  em does not alwa
20320 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72  ys provide power
20330 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e  safe overwrites.
20340 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77    (In other.** w
20350 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f  ords, after a po
20360 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20  wer-loss event, 
20370 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c  parts of the fil
20380 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65  e that were neve
20390 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67  r.** written mig
203a0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
203b0 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76  altered.)  Howev
203c0 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68  er, non-PSOW beh
203d0 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a  avior is very,.*
203e0 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e  * very rare.  An
203f0 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57  d asserting PSOW
20400 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72   makes a large r
20410 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  eduction in the 
20420 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71  amount.** of req
20430 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f  uired I/O for jo
20440 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20  urnaling, since 
20450 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67  a lot of padding
20460 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   is eliminated..
20470 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65  **  Hence, while
20480 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
20490 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65  RITE is on by de
204a0 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20  fault, there is 
204b0 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a  a file-control.*
204c0 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  * available to t
204d0 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55  urn it off and U
204e0 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  RI query paramet
204f0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  er available to 
20500 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a  turn it off..*/.
20510 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
20520 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20530 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
20540 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
20550 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
20560 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
20570 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e  = 0;.#ifdef __QN
20580 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e  XNTO__.  if( p->
20590 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20  sectorSize==0 ) 
205a0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69  unixSectorSize(i
205b0 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65  d);.  rc = p->de
205c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
205d0 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ics;.#endif.  if
205e0 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ( p->ctrlFlags &
205f0 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29   UNIXFILE_PSOW )
20600 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49  {.    rc |= SQLI
20610 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
20620 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
20630 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20640 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20650 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
20660 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
20670 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
20680 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
20690 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
206a0 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
206b0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
206c0 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
206d0 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
206e0 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
206f0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
20700 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
20710 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
20720 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
20730 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
20740 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
20750 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
20760 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
20770 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
20780 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
20790 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
207a0 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
207b0 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
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 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
207e0 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
207f0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
20800 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
20810 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
20820 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
20830 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
20840 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
20850 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
20860 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
20870 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
20880 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
20890 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
208a0 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
208b0 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
208c0 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
208d0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
208e0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
208f0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
20900 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
20910 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
20920 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
20930 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
20940 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
20950 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
20960 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
20970 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
20980 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
20990 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
209a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
209b0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
209c0 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
209d0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
209e0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
209f0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
20a00 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
20a10 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
20a20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
20a30 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
20a40 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
20a50 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
20a60 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
20a70 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
20a80 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
20a90 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
20aa0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
20ab0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
20ac0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
20ad0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
20ae0 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
20af0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
20b00 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
20b10 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
20b20 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
20b30 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
20b40 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
20b50 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
20b60 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
20b70 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
20b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
20b90 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
20ba0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bc0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
20bd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
20be0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c00 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
20c10 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
20c20 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c40 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
20c50 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
20c60 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
20c70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20c80 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
20c90 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
20ca0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
20cb0 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
20cc0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20cd0 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
20ce0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
20cf0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20d00 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
20d10 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
20d20 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
20d30 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
20d40 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
20d50 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
20d60 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
20d70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20d80 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
20d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20da0 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
20db0 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
20dc0 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
20dd0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
20de0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
20df0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
20e00 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
20e30 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
20e40 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
20e50 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
20e60 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
20e70 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
20e80 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
20e90 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
20ea0 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
20eb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
20ec0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
20ed0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
20ee0 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
20ef0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
20f00 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
20f10 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
20f20 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
20f30 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
20f40 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
20f50 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
20f60 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
20f70 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
20f80 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
20f90 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
20fa0 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
20fb0 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
20fc0 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
20fd0 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
20fe0 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
20ff0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
21000 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21010 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
21020 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
21030 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
21040 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
21050 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
21060 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21080 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
21090 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
210a0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
210b0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
210c0 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
210d0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
210e0 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
210f0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
21100 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
21110 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21120 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
21130 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
21140 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
21150 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
21160 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
21170 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
21180 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
21190 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
211a0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
211b0 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
211c0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
211d0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
211e0 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
211f0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
21200 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
21210 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
21220 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
21230 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
21240 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
21250 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
21260 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
21270 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
21280 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
21290 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
212a0 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
212b0 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
212c0 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
212d0 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
212e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
212f0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21300 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  (.  unixShmNode 
21310 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70  *pShmNode, /* Ap
21320 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
21330 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
21340 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
21350 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
21360 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
21370 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
21380 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
21390 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
213a0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
213b0 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
213c0 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
213d0 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
213e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
213f0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
21400 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
21410 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
21420 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
21430 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
21440 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
21450 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
21460 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
21470 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
21480 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
21490 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
214a0 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
214b0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
214c0 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
214d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
214e0 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
214f0 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
21500 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
21510 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
21520 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
21530 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
21540 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
21550 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
21560 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
21570 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
21580 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
21590 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
215a0 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
215b0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
215c0 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
215d0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
215e0 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
215f0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
21600 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
21610 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
21620 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
21630 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
21640 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
21650 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
21660 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
21670 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
21680 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
21690 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
216a0 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
216b0 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
216c0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
216d0 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
216e0 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
216f0 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
21700 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
21710 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
21720 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
21730 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
21740 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74  );.  mask = ofst
21750 3e 33 31 20 3f 20 30 78 66 66 66 66 66 66 66 66  >31 ? 0xffffffff
21760 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
21770 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
21780 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21790 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
217a0 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
217b0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
217c0 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
217d0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
217e0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
217f0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
21800 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
21810 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
21820 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
21830 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
21840 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21850 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
21860 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21870 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21880 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
21890 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
218a0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
218b0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
218c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
218d0 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
218e0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
218f0 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21900 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21910 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21920 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
21930 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21940 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
21950 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
21960 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
21970 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
21980 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21990 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
219a0 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
219b0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
219c0 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
219d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
219e0 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
219f0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
21a00 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21a10 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21a20 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21a30 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
21a40 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
21a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
21a60 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
21a70 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
21a80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
21a90 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21aa0 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
21ab0 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
21ac0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
21ad0 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f  c;        .}.../
21ae0 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
21af0 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  nixShmNodeList l
21b00 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
21b10 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e  es with unixShmN
21b20 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
21b30 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
21b40 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
21b50 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
21b60 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
21b70 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
21b80 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
21b90 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
21ba0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
21bb0 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65  hmPurge(unixFile
21bc0 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68   *pFd){.  unixSh
21bd0 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e  mNode *p = pFd->
21be0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
21bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
21c00 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
21c10 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65   if( p && p->nRe
21c20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  f==0 ){.    int 
21c30 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
21c40 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70  ->pInode==pFd->p
21c50 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c  Inode );.    sql
21c60 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
21c70 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66  p->mutex);.    f
21c80 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
21c90 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
21ca0 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
21cb0 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  .        osMunma
21cc0 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  p(p->apRegion[i]
21cd0 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a  , p->szRegion);.
21ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21cf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21d00 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  e(p->apRegion[i]
21d10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21d20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21d30 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a  e(p->apRegion);.
21d40 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
21d50 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
21d60 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c  close(pFd, p->h,
21d70 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
21d80 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20    p->h = -1;.   
21d90 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65   }.    p->pInode
21da0 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a  ->pShmNode = 0;.
21db0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21dc0 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
21dd0 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d  * Open a shared-
21de0 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
21df0 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e  ciated with open
21e00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
21e10 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20  DbFd.  .** This 
21e20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
21e30 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d  mentation uses m
21e40 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a  mapped files..**
21e50 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65  .** The file use
21e60 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
21e70 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20  hared-memory is 
21e80 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
21e90 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20  ctory.** as the 
21ea0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
21eb0 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  le and has the s
21ec0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
21ed0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
21ee0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22   file with the "
21ef0 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64  -shm" suffix add
21f00 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
21f10 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  , if the databas
21f20 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68  e file.** is "/h
21f30 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
21f40 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69  .db" then the fi
21f50 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  le that is creat
21f60 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a  ed and mmapped.*
21f70 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  * for shared mem
21f80 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ory will be call
21f90 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  ed "/home/user1/
21fa0 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20  config.db-shm". 
21fb0 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20   .**.** Another 
21fc0 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74  approach to is t
21fd0 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f  o use files in /
21fe0 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f  dev/shm or /dev/
21ff0 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d  tmp or an.** som
22000 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f  e other tmpfs mo
22010 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69  unt. But if a fi
22020 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
22030 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66  t directory.** f
22040 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
22050 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74   file is used, t
22060 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63  hen differing ac
22070 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
22080 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28  .** or a chroot(
22090 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77  ) might cause tw
220a0 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  o different proc
220b0 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  esses on the sam
220c0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f  e.** database to
220d0 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69   end up using di
220e0 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f  fferent files fo
220f0 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
22100 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68  - .** meaning th
22110 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  at their memory 
22120 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79  would not really
22130 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73   be shared - res
22140 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74  ulting.** in dat
22150 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
22160 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
22170 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65   this tmpfs file
22180 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65   usage.** can be
22190 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
221a0 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d  ile-time using -
221b0 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  DSQLITE_SHM_DIRE
221c0 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22  CTORY="/dev/shm"
221d0 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76  .** or the equiv
221e0 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20  alent.  The use 
221f0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48  of the SQLITE_SH
22200 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
22210 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69  ile-time.** opti
22220 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  on results in an
22230 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75   incompatible bu
22240 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20  ild of SQLite;  
22250 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
22260 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69  .** that with di
22270 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53  ffering SQLITE_S
22280 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74  HM_DIRECTORY set
22290 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f  tings attempt to
222a0 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   use the.** same
222b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
222c0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
222d0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
222e0 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  tion will likely
222f0 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20  .** result. The 
22300 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
22310 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
22320 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73  e option is cons
22330 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70  idered.** "unsup
22340 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20  ported" and may 
22350 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74  go away in a fut
22360 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61  ure SQLite relea
22370 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  se..**.** When o
22380 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
22390 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
223a0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
223b0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
223c0 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
223d0 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
223e0 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
223f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
22400 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
22410 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
22420 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
22430 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
22440 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
22450 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69  **.** If the ori
22460 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
22470 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75  ile (pDbFd) is u
22480 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65  sing the "unix-e
22490 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74  xcl" VFS.** that
224a0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65   means that an e
224b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
224c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
224d0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a  abase file and.*
224e0 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  * that no other 
224f0 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62  processes are ab
22500 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  le to read or wr
22510 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
22520 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61  .  In.** that ca
22530 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65  se, we do not re
22540 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64  ally need shared
22550 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61   memory.  No sha
22560 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69  red memory.** fi
22570 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  le is created.  
22580 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
22590 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61  y will be simula
225a0 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65  ted with heap me
225b0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
225c0 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  int unixOpenShar
225d0 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
225e0 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
225f0 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
22600 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
22610 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
22620 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
22630 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
22640 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
22650 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
22660 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
22670 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
226a0 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ode */.  unixIno
226b0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
226c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
226d0 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20  inode of fd */. 
226e0 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e   char *zShmFilen
226f0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
22700 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
22710 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48  file used for SH
22720 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46  M */.  int nShmF
22730 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
22740 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22750 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61  f the SHM filena
22760 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
22770 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
22780 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
22790 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20  unixShm object. 
227a0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
227b0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
227c0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
227d0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
227e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
227f0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
22800 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p));.  assert( p
22810 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
22820 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
22830 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d  see if a unixShm
22840 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65  Node object alre
22850 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73  ady exists. Reus
22860 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  e an existing.  
22870 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e  ** one if presen
22880 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  t. Create a new 
22890 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
228a0 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
228b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
228c0 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
228d0 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  ode;.  pShmNode 
228e0 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  = pInode->pShmNo
228f0 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  de;.  if( pShmNo
22900 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  de==0 ){.    str
22910 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20  /* fstat() info 
22940 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
22950 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  e */..    /* Cal
22960 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67  l fstat() to fig
22970 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d  ure out the perm
22980 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64  issions on the d
22990 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
229a0 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d  .    ** a new *-
229b0 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61  shm file is crea
229c0 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ted, an attempt 
229d0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
229e0 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  create it.    **
229f0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
22a00 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20  ermissions..    
22a10 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74  */.    if( osFst
22a20 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53  at(pDbFd->h, &sS
22a30 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e  tat) && pInode->
22a40 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
22a50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22a60 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
22a70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
22a80 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
22a90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22aa0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
22ab0 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    nShmFilename =
22ac0 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53   sizeof(SQLITE_S
22ad0 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20  HM_DIRECTORY) + 
22ae0 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53  31;.#else.    nS
22af0 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b  hmFilename = 6 +
22b00 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62   (int)strlen(pDb
22b10 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64  Fd->zPath);.#end
22b20 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  if.    pShmNode 
22b30 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
22b40 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
22b50 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61  de) + nShmFilena
22b60 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  me );.    if( pS
22b70 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
22b80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
22b90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
22ba0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
22bb0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
22bc0 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
22bd0 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e  eof(*pShmNode)+n
22be0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
22bf0 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
22c00 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
22c10 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
22c20 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
22c30 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
22c40 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
22c50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
22c60 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
22c70 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
22c90 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
22ca0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
22cb0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
22cd0 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
22ce0 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
22cf0 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
22d00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
22d10 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
22d20 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
22d30 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
22d40 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
22d50 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
22d60 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69  d->zPath, zShmFi
22d70 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
22d80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
22d90 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
22da0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
22db0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
22dc0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
22dd0 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
22de0 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
22df0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
22e00 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
22e10 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
22e20 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
22e30 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
22e40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22e50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
22e60 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
22e70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
22e80 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
22e90 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
22ea0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
22eb0 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
22ec0 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  AT;.      if( sq
22ed0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
22ee0 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  n(pDbFd->zPath, 
22ef0 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20  "readonly_shm", 
22f00 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  0) ){.        op
22f10 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e  enFlags = O_RDON
22f20 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d  LY;.        pShm
22f30 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
22f40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
22f50 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
22f60 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53  = robust_open(zS
22f70 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e  hmFilename, open
22f80 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74  Flags, (sStat.st
22f90 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20  _mode&0777));.  
22fa0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
22fb0 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->h<0 ){.       
22fc0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
22fd0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
22fe0 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
22ff0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
23000 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
23010 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
23020 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
23030 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
23040 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c  running as root,
23050 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
23060 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20  the SHM file.   
23070 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62     ** is owned b
23080 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20  y the same user 
23090 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72  that owns the or
230a0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
230b0 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20    Otherwise,.   
230c0 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
230d0 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f  al owner will no
230e0 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e  t be able to con
230f0 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nect..      */. 
23100 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 70 53       osFchown(pS
23110 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74  hmNode->h, sStat
23120 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73  .st_uid, sStat.s
23130 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20  t_gid);.  .     
23140 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
23150 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
23160 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
23170 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
23180 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ch..      ** If 
23190 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
231a0 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
231b0 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f  ength. .      */
231c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
231d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
231e0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
231f0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
23200 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  RLCK, UNIX_SHM_D
23210 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
23220 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
23230 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
23240 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30  e(pShmNode->h, 0
23250 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
23260 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
23270 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
23280 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74  MOPEN, "ftruncat
23290 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  e", zShmFilename
232a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
232b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
232c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
232d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
232e0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
232f0 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
23300 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
23310 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
23320 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
23330 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
23340 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
23350 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
23360 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
23370 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
23380 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
23390 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
233a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
233b0 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
233c0 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
233d0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
233e0 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
233f0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
23400 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
23410 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
23420 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
23430 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
23440 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
23450 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
23460 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
23470 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
23480 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
23490 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
234a0 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
234b0 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62  ruct unixShm) ob
234c0 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
234d0 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
234e0 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
234f0 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
23500 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
23510 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
23520 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
23530 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
23540 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
23550 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
23560 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
23570 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
23580 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78  utex .  ** mutex
23590 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
235a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
235b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
235c0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
235d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
235e0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
235f0 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
23600 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
23610 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23630 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
23640 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
23650 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
23660 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
23670 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20  DbFd);       /* 
23680 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
23690 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
236a0 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
236b0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69  3_free(p);.  uni
236c0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
236d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
236e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
236f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
23700 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
23710 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
23720 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
23730 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
23740 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
23750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
23760 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
23770 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
23780 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
23790 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
237a0 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
237b0 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
237c0 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
237d0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
237e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
237f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
23800 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
23810 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
23820 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
23830 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e  e, if the bExten
23840 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
23850 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
23860 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
23870 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
23880 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
23890 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
238a0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
238b0 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
238c0 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
238d0 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
238e0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
238f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23900 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e  d. If .** bExten
23910 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  d is non-zero an
23920 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
23930 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
23940 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
23950 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
23960 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
23970 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
23980 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
23990 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
239a0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
239b0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
239c0 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
239d0 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
239e0 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
239f0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
23a00 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
23a10 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
23a20 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
23a30 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
23a40 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
23a50 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
23a60 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
23a70 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
23a80 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
23a90 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
23aa0 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
23ab0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
23ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
23ad0 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
23ae0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
23af0 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b10 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
23b20 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
23b30 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
23b40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
23b50 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
23b60 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20   int bExtend,   
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
23b90 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
23ba0 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
23bb0 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
23bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
23bd0 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
23be0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
23bf0 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
23c00 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53  ile*)fd;.  unixS
23c10 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d  hm *p;.  unixShm
23c20 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
23c30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23c40 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  E_OK;..  /* If t
23c50 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
23c60 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
23c70 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
23c80 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
23c90 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d   if( pDbFd->pShm
23ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
23cb0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
23cc0 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
23cd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23ce0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
23cf0 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64    }..  p = pDbFd
23d00 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f  ->pShm;.  pShmNo
23d10 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
23d20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
23d30 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
23d40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
23d50 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
23d60 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
23d70 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
23d80 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
23d90 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
23da0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
23db0 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
23dc0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
23dd0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
23de0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
23df0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
23e00 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
23e10 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
23e20 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
23e30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
23e40 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
23e50 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61  egion ){.    cha
23e60 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  r **apNew;      
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b  /* New apRegion[
23e90 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
23ea0 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
23eb0 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
23ec0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
23ed0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
23ee0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
23ef0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
23f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
23f10 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a  d by fstat() */.
23f20 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
23f30 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
23f40 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  on;..    if( pSh
23f50 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
23f60 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
23f70 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
23f80 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
23f90 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
23fa0 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
23fb0 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
23fc0 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
23fd0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
23fe0 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
23ff0 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
24000 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
24010 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
24020 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
24030 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  n)..      */.   
24040 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
24050 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74  ShmNode->h, &sSt
24060 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  at) ){.        r
24070 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
24080 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20  _SHMSIZE;.      
24090 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
240a0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  ut;.      }.  . 
240b0 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73       if( sStat.s
240c0 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a  t_size<nByte ){.
240d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
240e0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
240f0 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
24100 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e  exist. If bExten
24110 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  d is set to.    
24120 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78      ** false, ex
24130 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
24140 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
24150 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
24160 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
24170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
24180 20 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20   !bExtend ){.   
24190 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
241a0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
241b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
241c0 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
241d0 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65   bExtend is true
241e0 2c 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c  , extend the fil
241f0 65 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20  e. Do this by.  
24200 20 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67        ** writing
24210 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
24220 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  o the end of eac
24230 68 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e  h (OS) page bein
24240 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  g.        ** all
24250 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64  ocated or extend
24260 65 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  ed. Technically,
24270 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72   we need only wr
24280 69 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ite to the.     
24290 20 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20     ** last page 
242a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65  in order to exte
242b0 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74  nd the file. But
242c0 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20   writing to all 
242d0 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  new.        ** p
242e0 61 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20  ages forces the 
242f0 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  OS to allocate t
24300 68 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c  hem immediately,
24310 20 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20   which reduces. 
24320 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68         ** the ch
24330 61 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20  ances of SIGBUS 
24340 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
24350 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f  the mapped regio
24360 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20  n later on..    
24370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65      */.        e
24380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
24390 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
243a0 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20  pgsz = 4096;.   
243b0 20 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a         int iPg;.
243c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  .          /* Wr
243d0 69 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ite to the last 
243e0 62 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77  byte of each new
243f0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  ly allocated or 
24400 65 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f  extended page */
24410 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24420 74 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a  t( (nByte % pgsz
24430 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
24440 20 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74    for(iPg=(sStat
24450 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20  .st_size/pgsz); 
24460 69 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29  iPg<(nByte/pgsz)
24470 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPg++){.      
24480 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e        if( seekAn
24490 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64  dWriteFd(pShmNod
244a0 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b  e->h, iPg*pgsz +
244b0 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20   pgsz-1, "", 1, 
244c0 30 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  0)!=1 ){.       
244d0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
244e0 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
244f0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
24510 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
24520 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
24530 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
24540 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
24550 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24560 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
24570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
24580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24590 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
245a0 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
245b0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
245c0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
245d0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
245e0 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
245f0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
24600 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
24610 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
24620 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  pRegion, (iRegio
24630 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72  n+1)*sizeof(char
24640 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   *).    );.    i
24650 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
24660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
24670 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
24680 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
24690 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
246a0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
246b0 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68   = apNew;.    wh
246c0 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ile(pShmNode->nR
246d0 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b  egion<=iRegion){
246e0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65  .      void *pMe
246f0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  m;.      if( pSh
24700 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
24710 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73         pMem = os
24720 4d 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e  Mmap(0, szRegion
24730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ,.            pS
24740 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
24750 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a  ly ? PROT_READ :
24760 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
24770 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
24780 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20      MAP_SHARED, 
24790 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52  pShmNode->h, szR
247a0 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e  egion*(i64)pShmN
247b0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20  ode->nRegion.   
247c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
247d0 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
247e0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
247f0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
24800 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
24810 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
24820 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
24830 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
24840 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24850 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
24860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24870 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
24880 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e  _malloc(szRegion
24890 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
248a0 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
248b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
248c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
248d0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
248e0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
248f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
24900 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
24910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
24920 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
24930 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
24940 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20  on] = pMem;.    
24950 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
24960 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
24970 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
24980 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
24990 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
249a0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
249b0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
249c0 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
249d0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
249e0 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
249f0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
24a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
24a20 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
24a30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
24a40 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
24a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24a60 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
24a70 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
24a80 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
24a90 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
24aa0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
24ab0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
24ac0 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
24ad0 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
24ae0 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
24af0 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
24b00 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
24b10 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
24b20 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
24b30 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
24b40 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
24b50 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
24b60 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
24b70 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
24b80 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
24b90 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
24ba0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
24bb0 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
24bc0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
24bd0 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
24be0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
24bf0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
24c00 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
24c10 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
24c20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
24c50 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
24c60 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24c90 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
24ca0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
24cb0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24cd0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
24ce0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
24cf0 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
24d00 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
24d10 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
24d20 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
24d30 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
24d40 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
24d50 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
24d60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
24d70 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
24d80 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
24d90 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
24dc0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
24dd0 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
24de0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
24df0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
24e00 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
24e10 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
24e20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24e30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
24e40 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
24e50 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
24e60 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
24e90 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
24ea0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
24eb0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
24ec0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
24ed0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
24ee0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
24ef0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
24f00 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
24f10 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
24f20 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
24f30 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
24f40 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
24f50 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
24f60 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
24f70 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
24f80 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
24f90 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
24fa0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
24fb0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
24fc0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
24fd0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
24fe0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
24ff0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
25000 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
25010 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
25020 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
25030 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
25040 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
25050 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
25060 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
25070 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
25080 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
25090 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
250a0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
250b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
250c0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
250d0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
250e0 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
250f0 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
25100 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
25110 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
25120 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
25130 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
25140 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
25150 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
25160 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
25170 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
25180 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
25190 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
251a0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
251b0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
251c0 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
251d0 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
251e0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
251f0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
25200 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
25210 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
25220 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
25230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
25240 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
25250 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
25260 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
25270 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
25280 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
25290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
252a0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
252b0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
252c0 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
252d0 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
252e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
252f0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
25300 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20  mNode, F_UNLCK, 
25310 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
25320 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
25330 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
25340 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
25350 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
25360 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
25370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
25390 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
253a0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
253b0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
253c0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
253d0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
253e0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
253f0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
25400 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
25410 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
25420 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
25430 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
25440 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
25450 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
25460 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
25470 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
25480 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
25490 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
254a0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
254b0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
254c0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
254d0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
254e0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
254f0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
25500 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
25510 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
25520 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
25530 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
25540 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
25550 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
25560 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
25570 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25580 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
25590 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
255a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
255b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
255c0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
255d0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
255e0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
255f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25600 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
25610 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
25620 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
25630 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
25640 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
25650 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
25660 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
25670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
25680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25690 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
256a0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
256b0 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
256c0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
256d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
256e0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
256f0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
25700 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
25710 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
25720 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
25730 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
25740 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
25750 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
25760 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
25770 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
25780 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
25790 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
257a0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
257b0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
257c0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
257d0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
257e0 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
257f0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
25800 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25810 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
25820 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25830 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
25840 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
25850 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
25860 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
25870 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
25880 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
25890 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
258a0 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
258b0 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
258c0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
258d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
258e0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
258f0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
25900 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  , F_WRLCK, ofst+
25910 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
25920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
25930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
25950 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
25960 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
25970 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
25980 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
25990 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
259a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
259b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
259c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
259d0 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
259e0 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
259f0 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
25a00 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70       p->id, getp
25a10 69 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  id(), p->sharedM
25a20 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
25a30 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
25a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
25a50 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
25a60 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
25a70 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
25a80 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
25a90 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
25aa0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
25ab0 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
25ac0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
25ad0 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
25ae0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
25af0 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
25b00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
25b10 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
25b20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
25b30 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
25b40 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
25b50 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
25b60 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
25b70 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
25b80 45 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78  ETER(fd);.  unix
25b90 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
25ba0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
25bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
25bc0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
25bd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
25be0 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
25bf0 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
25c00 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
25c10 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
25c20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
25c30 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
25c40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
25c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e   connection then
25c60 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
25c70 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
25c80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
25c90 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  int unixShmUnmap
25ca0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
25cb0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
25cc0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
25cd0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
25ce0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ile */.  int del
25cf0 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
25d00 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
25d10 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  te shared-memory
25d20 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
25d30 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20   unixShm *p;    
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
25d60 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
25d70 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
25d80 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
25d90 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
25da0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
25db0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
25dc0 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  nixShm **pp;    
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25de0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
25df0 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
25e00 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78  ctions */.  unix
25e10 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
25e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
25e40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
25e50 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46    pDbFd = (unixF
25e60 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
25e70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
25e80 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
25e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
25ea0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
25eb0 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ode;..  assert( 
25ec0 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d  pShmNode==pDbFd-
25ed0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
25ee0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25ef0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
25f00 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
25f10 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
25f20 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
25f30 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
25f40 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
25f50 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
25f60 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
25f70 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
25f80 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25f90 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
25fa0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
25fb0 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
25fc0 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
25fd0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
25fe0 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
25ff0 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
26000 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
26010 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
26020 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
26030 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
26040 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
26050 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
26060 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
26070 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
26080 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
26090 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
260a0 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75  file, too */.  u
260b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
260c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
260d0 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
260e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
260f0 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
26100 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
26110 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
26120 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e   && pShmNode->h>
26130 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53  =0 ) osUnlink(pS
26140 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
26150 65 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50  e);.    unixShmP
26160 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
26170 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
26180 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
26190 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
261a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
261b0 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
261c0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
261d0 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
261e0 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
261f0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
26200 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
26210 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
26220 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
26230 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
26240 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
26250 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72  ** If it is curr
26260 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70  ently memory map
26270 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20  ped, unmap file 
26280 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pFd..*/.static v
26290 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  oid unixUnmapfil
262a0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
262b0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  {.  assert( pFd-
262c0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
262d0 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70  .  if( pFd->pMap
262e0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73  Region ){.    os
262f0 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70  Munmap(pFd->pMap
26300 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61  Region, pFd->mma
26310 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20  pSizeActual);.  
26320 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
26330 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e  n = 0;.    pFd->
26340 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
26350 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41    pFd->mmapSizeA
26360 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ctual = 0;.  }.}
26370 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
26380 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73  he system page s
26390 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
263a0 6e 74 20 75 6e 69 78 47 65 74 50 61 67 65 73 69  nt unixGetPagesi
263b0 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 48 41  ze(void){.#if HA
263c0 56 45 5f 4d 52 45 4d 41 50 0a 20 20 72 65 74 75  VE_MREMAP.  retu
263d0 72 6e 20 35 31 32 3b 0a 23 65 6c 69 66 20 64 65  rn 512;.#elif de
263e0 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43  fined(_BSD_SOURC
263f0 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70  E).  return getp
26400 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65  agesize();.#else
26410 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73  .  return (int)s
26420 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53  ysconf(_SC_PAGES
26430 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  IZE);.#endif.}..
26440 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
26450 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
26460 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
26470 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ing maintained b
26480 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72  y file .** descr
26490 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65  iptor pFd to nNe
264a0 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69  w bytes. Any exi
264b0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
264c0 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a   discarded..**.*
264d0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
264e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
264f0 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ets the followin
26500 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
26510 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
26520 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20  e.pMapRegion.** 
26530 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
26540 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20  mapSize.**      
26550 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
26560 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49  zeActual.**.** I
26570 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  f unsuccessful, 
26580 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
26590 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73   is logged via s
265a0 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64  qlite3_log() and
265b0 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61  .** the three va
265c0 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72  riables above ar
265d0 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69  e zeroed. In thi
265e0 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68  s case SQLite sh
265f0 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  ould.** continue
26600 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
26610 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
26620 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57  e xRead() and xW
26630 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  rite().** method
26640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
26650 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28  d unixRemapfile(
26660 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
26670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26680 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
26690 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  iptor object */.
266a0 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20    i64 nNew      
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61    /* Required ma
266d0 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b  pping size */.){
266e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
266f0 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20  Err = "mmap";.  
26700 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20  int h = pFd->h; 
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
26730 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
26740 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  db file */.  u8 
26750 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70  *pOrig = (u8 *)p
26760 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20  Fd->pMapRegion; 
26770 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
26780 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70  current file map
26790 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  ping */.  i64 nO
267a0 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  rig = pFd->mmapS
267b0 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f  izeActual;     /
267c0 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20  * Size of pOrig 
267d0 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20  region in bytes 
267e0 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20  */.  u8 *pNew = 
267f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
26800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
26810 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70  ation of new map
26820 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ping */.  int fl
26830 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b  ags = PROT_READ;
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26850 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
26860 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20  to mmap() */..  
26870 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
26880 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
26890 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d  ssert( nNew>pFd-
268a0 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
268b0 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64  ssert( nNew<=pFd
268c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b  ->mmapSizeMax );
268d0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
268e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
268f0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26900 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  al>=pFd->mmapSiz
26910 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  e );.  assert( M
26920 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a  AP_FAILED!=0 );.
26930 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72  .  if( (pFd->ctr
26940 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
26950 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66  E_RDONLY)==0 ) f
26960 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49  lags |= PROT_WRI
26970 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  TE;..  if( pOrig
26980 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
26990 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 75 6e  t szSyspage = un
269a0 69 78 47 65 74 50 61 67 65 73 69 7a 65 28 29 3b  ixGetPagesize();
269b0 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
269c0 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  = (pFd->mmapSize
269d0 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31   & ~(szSyspage-1
269e0 29 29 3b 0a 20 20 20 20 75 38 20 2a 70 52 65 71  ));.    u8 *pReq
269f0 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
26a00 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
26a10 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
26a20 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
26a30 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
26a40 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
26a50 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
26a60 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
26a70 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
26a80 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
26a90 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
26aa0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
26ab0 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
26ac0 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
26ad0 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
26ae0 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
26af0 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
26b00 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
26b10 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
26b20 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
26b30 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
26b40 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
26b50 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
26b60 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
26b70 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
26b80 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
26b90 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
26ba0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
26bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
26bc0 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
26bd0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
26be0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
26bf0 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
26c00 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
26c10 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
26c20 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
26c30 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
26c40 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
26c50 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
26c60 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
26c70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
26c80 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
26c90 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
26ca0 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
26cb0 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
26cc0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
26cd0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
26ce0 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
26cf0 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
26d00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
26d10 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
26d20 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
26d30 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
26d40 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
26d50 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
26d60 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
26d70 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
26d80 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
26d90 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
26da0 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
26db0 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
26dc0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
26dd0 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
26de0 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
26df0 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
26e00 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
26e10 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
26e20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
26e30 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
26e40 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
26e50 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
26e60 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
26e70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26e80 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
26e90 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
26ea0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
26eb0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
26ec0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
26ed0 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
26ee0 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
26ef0 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
26f00 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
26f10 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
26f20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
26f30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
26f40 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
26f50 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
26f60 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
26f70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
26f80 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
26f90 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
26fa0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
26fc0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
26fd0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
26fe0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
26ff0 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
27000 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
27010 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
27020 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
27030 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
27040 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
27050 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
27060 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
27070 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
27080 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
27090 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
270a0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
270b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
270c0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
270d0 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
270e0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
270f0 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
27100 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
27110 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
27120 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
27130 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
27140 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
27150 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
27160 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
27170 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
27180 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
27190 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
271a0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
271b0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
271c0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
271d0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
271e0 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
271f0 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  i64 nMap = nByte
27200 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
27210 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
27220 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
27230 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
27240 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
27250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27260 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
27270 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
27280 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
27290 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
272a0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
272b0 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  on */.    rc = o
272c0 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26  sFstat(pFd->h, &
272d0 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
272e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
272f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27300 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
27310 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  AT;.    }.    nM
27320 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ap = statbuf.st_
27330 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  size;.  }.  if( 
27340 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
27350 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
27360 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
27370 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  eMax;.  }..  if(
27380 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
27390 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
273a0 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20  nMap>0 ){.      
273b0 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46  unixRemapfile(pF
273c0 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65  d, nMap);.    }e
273d0 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55  lse{.      unixU
273e0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
273f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
27400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27410 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27420 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
27430 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
27440 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
27450 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
27460 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
27470 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
27480 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
27490 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
274a0 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
274b0 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
274c0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
274d0 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
274e0 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
274f0 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
27500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
27510 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
27520 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
27530 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
27540 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
27550 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
27560 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
27570 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
27580 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
27590 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
275a0 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
275b0 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
275c0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
275d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
275e0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
275f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
27600 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
27610 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
27620 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
27630 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
27640 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a  unixUnfetch()..*
27650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27660 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  xFetch(sqlite3_f
27670 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
27680 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
27690 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
276a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
276b0 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  E>0.  unixFile *
276c0 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
276d0 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
276e0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
276f0 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  se file */.#endi
27700 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69  f.  *pp = 0;..#i
27710 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27720 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
27730 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
27740 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
27750 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
27760 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
27770 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
27780 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
27790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
277a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
277b0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
277c0 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
277d0 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
277e0 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
277f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
27800 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
27810 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
27820 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
27830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
27850 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
27860 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
27870 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27880 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
27890 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
278a0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
278b0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
278c0 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
278d0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
278e0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
278f0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
27900 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
27910 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
27920 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
27930 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
27940 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
27950 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
27960 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
27970 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
27980 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
27990 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
279a0 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
279b0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
279c0 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
279d0 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
279e0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
279f0 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
27a00 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
27a10 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
27a20 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
27a30 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
27a40 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
27a50 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 55  f, void *p){.  U
27a60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27a70 69 4f 66 66 29 3b 0a 23 69 66 20 53 51 4c 49 54  iOff);.#if SQLIT
27a80 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27a90 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
27aa0 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
27ab0 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
27ac0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
27ad0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
27ae0 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
27af0 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
27b00 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
27b10 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
27b20 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
27b30 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
27b40 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
27b50 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
27b60 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
27b70 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
27b80 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
27b90 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
27ba0 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
27bb0 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
27bc0 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
27bd0 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
27be0 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
27bf0 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
27c00 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
27c10 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
27c20 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
27c30 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
27c40 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
27c50 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
27c60 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
27c70 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
27c80 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
27c90 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20  t>=0 );.#else.  
27ca0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27cb0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
27cc0 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
27cd0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
27ce0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
27cf0 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
27d00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
27d10 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
27d20 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
27d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d40 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
27d50 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
27d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
27d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
27dd0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
27de0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
27df0 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
27e00 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
27e10 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
27e20 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
27e30 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
27e40 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
27e50 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
27e60 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
27e70 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
27e80 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
27e90 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
27ea0 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
27eb0 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
27ec0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
27ed0 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
27ee0 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
27ef0 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
27f00 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
27f10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
27f20 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
27f30 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
27f40 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
27f50 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
27f60 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
27f70 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
27f80 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
27f90 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
27fa0 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
27fb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
27fc0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
27fd0 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
27fe0 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
27ff0 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
28000 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
28010 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
28020 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
28030 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
28040 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
28050 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
28060 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
28070 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69  For finder-funti
28080 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
28090 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
280a0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
280b0 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
280c0 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
280d0 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
280e0 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
280f0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
28100 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
28110 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
28120 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
28130 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
28140 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
28150 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
28160 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
28170 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
28180 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
28190 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
281a0 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
281b0 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
281c0 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
281d0 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
281e0 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
281f0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
28200 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
28210 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
28220 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
28230 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
28240 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
28250 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
28260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28270 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
28280 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
28290 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
282a0 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
282b0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
282c0 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
282d0 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
282e0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
282f0 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
28300 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
28310 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
28320 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
28330 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
28340 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
28350 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
28360 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20  FINDER, METHOD, 
28370 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20  VERSION, CLOSE, 
28380 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
28390 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61  LOCK)      \.sta
283a0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
283b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
283c0 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
283f0 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
28400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
28410 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
28440 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
28450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28460 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28490 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
284a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
284b0 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
284e0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
284f0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
28500 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
28530 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
28540 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
28550 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
28580 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
28590 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
285a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
285d0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
285e0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
285f0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28680 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
286e0 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
28710 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
28720 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
28730 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28750 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
28760 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
28770 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
28780 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
287a0 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
287b0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
287c0 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
287d0 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
287f0 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20    unixShmMap,   
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28810 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28840 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28860 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28890 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
288a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
288b0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
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 5c 0a 20 20 20 75            \.   u
288e0 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  nixShmUnmap,    
288f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28900 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28930 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  ixFetch,        
28940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
28950 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28980 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20  xUnfetch,       
28990 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
289a0 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
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 5c 0a 7d 3b 20 20 20 20 20         \.};     
289d0 20 20 20 20 20 20 20 20 20 20 20 20 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 5c 0a 73 74 61 74 69 63 20 63        \.static c
28a20 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28a30 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
28a40 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
28a50 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
28a60 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
28a70 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
28a80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
28a90 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
28ac0 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
28b60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28b70 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
28b80 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
28b90 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
28ba0 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
28bb0 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
28bc0 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
28bd0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
28be0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
28bf0 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
28c00 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
28c10 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
28c20 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
28c30 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
28c40 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
28c50 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
28c60 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
28c70 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
28c80 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
28c90 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
28ca0 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
28cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
28cc0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28cd0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
28ce0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
28d00 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64  hared memory and
28d10 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65   mmap are enable
28d20 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
28d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28d40 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
28d50 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
28d80 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
28d90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28da0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
28db0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
28dc0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
28dd0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
28de0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
28df0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
28e00 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
28e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
28e20 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
28e30 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
28e40 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
28e50 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
28e60 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
28e70 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
28ea0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
28eb0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ed0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
28ee0 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f00 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
28f10 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f30 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
28f40 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
28f50 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a  eservedLock   /*
28f60 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
28f70 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
28f80 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74  IOMETHODS(.  dot
28f90 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
28fa0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
28fb0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
28fc0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  /.  dotlockIoMet
28fd0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  hods,         /*
28fe0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28ff0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
29000 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29020 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
29030 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
29040 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20   dotlockClose,  
29050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29060 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29070 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20   dotlockLock,   
29080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
29090 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
290a0 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20  dotlockUnlock,  
290b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
290c0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
290d0 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73   dotlockCheckRes
290e0 65 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43  ervedLock  /* xC
290f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29100 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
29110 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29120 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
29130 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d   !OS_VXWORKS.IOM
29140 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49  ETHODS(.  flockI
29150 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29160 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29170 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29180 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c   flockIoMethods,
29190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
291a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
291b0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
291c0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
291d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
291e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
291f0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c  disabled */.  fl
29200 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
29210 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29220 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  e method */.  fl
29230 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
29240 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29250 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
29260 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
29270 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29280 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
29290 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
292a0 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
292b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
292c0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
292d0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
292e0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
292f0 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
29300 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29310 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29320 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
29330 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
29340 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29350 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29360 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29390 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
293a0 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20    semClose,     
293b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
293c0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
293d0 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20    semLock,      
293e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
293f0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29400 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   semUnlock,     
29410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
29420 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29430 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76    semCheckReserv
29440 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
29450 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29460 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
29470 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
29480 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29490 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
294a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
294b0 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
294c0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
294d0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
294e0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
294f0 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
29500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29510 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29520 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29530 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29550 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29560 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70  isabled */.  afp
29570 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
29580 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29590 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
295a0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
295b0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
295c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
295d0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
295e0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
295f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
29600 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29610 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
29620 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29630 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29640 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
29650 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
29660 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68  is a "super-meth
29670 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65  od" in the sense
29680 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e   that it.** open
29690 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  s secondary file
296a0 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
296b0 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c   the conch and l
296c0 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a  ock files and.**
296d0 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20   it uses proxy, 
296e0 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61  dot-file, AFP, a
296f0 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  nd flock() locki
29700 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  ng methods on th
29710 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79  ose.** secondary
29720 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69   files.  For thi
29730 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
29740 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
29750 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20  ements.** proxy 
29760 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74  locking is locat
29770 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20  ed much further 
29780 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  down in the file
29790 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a  .  But we need.*
297a0 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  * to go ahead an
297b0 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c  d define the sql
297c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
297d0 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  and finder funct
297e0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79  ion.** for proxy
297f0 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20   locking here.  
29800 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65  So we forward de
29810 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65  clare the I/O me
29820 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  thods..*/.#if de
29830 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29840 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29850 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29860 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
29870 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
29880 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  le*);.static int
29890 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
298a0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
298b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
298c0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
298d0 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
298e0 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63  ic int proxyChec
298f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
29900 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
29910 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  *);.IOMETHODS(. 
29920 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20   proxyIoFinder, 
29930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29940 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
29950 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d  me */.  proxyIoM
29960 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
29970 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
29980 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
29990 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
299c0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
299d0 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c  */.  proxyClose,
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
299f0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
29a00 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20  */.  proxyLock, 
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29a20 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
29a30 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c  /.  proxyUnlock,
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29a50 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
29a60 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52  */.  proxyCheckR
29a70 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
29a80 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
29a90 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
29aa0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
29ab0 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
29ac0 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
29ad0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
29ae0 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
29af0 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
29b00 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29b10 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29b20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
29b30 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
29b40 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29b50 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29b60 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29b70 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
29b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b90 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29ba0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
29bb0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bd0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29be0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29bf0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c10 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29c20 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29c40 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29c50 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20  .  nfsUnlock,   
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29c70 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
29c80 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
29c90 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
29ca0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29cb0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29cc0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
29cd0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29ce0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29cf0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29d00 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
29d10 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
29d20 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
29d30 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
29d40 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
29d50 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
29d60 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
29d70 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
29d80 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
29d90 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
29da0 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
29db0 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
29dc0 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
29dd0 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e  is for MacOSX on
29de0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
29df0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
29e00 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
29e10 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
29e20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
29e30 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
29e40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
29e50 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
29e60 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
29e70 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65      /* open file
29e80 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
29e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29ea0 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
29eb0 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e  st struct Mappin
29ec0 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  g {.    const ch
29ed0 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b  ar *zFilesystem;
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ef0 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   Filesystem type
29f00 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   name */.    con
29f10 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
29f20 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b  thods *pMethods;
29f30 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74     /* Appropriat
29f40 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
29f50 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d   */.  } aMap[] =
29f60 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
29f70 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
29f80 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73  ds },.    { "ufs
29f90 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
29fa0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
29fb0 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  afpfs",  &afpIoM
29fc0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
29fd0 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
29fe0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
29ff0 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
2a000 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
2a010 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
2a020 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2a030 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2a040 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
2a050 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2a060 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2a070 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2a080 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2a090 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2a0a0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2a0b0 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2a0c0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2a0d0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2a0e0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2a0f0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2a100 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
2a110 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
2a120 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
2a130 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
2a140 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
2a150 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a160 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2a170 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
2a180 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
2a190 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
2a1a0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2a1b0 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2a1c0 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
2a1d0 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
2a1e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2a1f0 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
2a200 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
2a210 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
2a220 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
2a230 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
2a240 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
2a250 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
2a260 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
2a270 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
2a280 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
2a290 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2a2a0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2a2b0 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
2a2c0 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
2a2d0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2a2e0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2a2f0 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2a300 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2a310 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2a320 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2a330 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2a340 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2a350 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2a360 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66  )!=-1 ) {.    if
2a370 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2a380 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
2a390 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
2a3a0 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65   return &nfsIoMe
2a3b0 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73  thods;.    } els
2a3c0 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e {.      return
2a3d0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2a3e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2a3f0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74  .    return &dot
2a400 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2a410 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2a420 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2a430 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2a440 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2a450 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
2a460 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
2a470 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2a480 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
2a490 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2a4a0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2a4b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2a4c0 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
2a4d0 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  S && SQLITE_ENAB
2a4e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a4f0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
2a500 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
2a510 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
2a520 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
2a530 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
2a540 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
2a550 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
2a560 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
2a570 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
2a580 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
2a590 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
2a5a0 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
2a5b0 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
2a5c0 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20   is for VXWorks 
2a5d0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
2a5e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a5f0 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
2a600 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
2a610 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2a620 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2a630 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2a640 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2a650 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2a660 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65        /* the ope
2a670 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  n file object */
2a680 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  .){.  struct flo
2a690 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2a6a0 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2a6b0 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2a6c0 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2a6d0 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2a6e0 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2a6f0 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2a700 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2a710 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2a720 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2a730 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2a740 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  ;.  }..  /* Test
2a750 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73   if fcntl() is s
2a760 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65  upported and use
2a770 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
2a780 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  ks..  ** Otherwi
2a790 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  se fall back to 
2a7a0 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
2a7b0 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f  ore method..  */
2a7c0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
2a7d0 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
2a7e0 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
2a7f0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
2a800 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
2a810 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
2a820 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
2a830 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
2a840 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
2a850 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
2a860 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2a870 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
2a880 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
2a890 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  semIoMethods;.  
2a8a0 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
2a8b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a8c0 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
2a8d0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2a8e0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2a8f0 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
2a900 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
2a910 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
2a920 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45  XWORKS && SQLITE
2a930 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a940 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
2a950 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
2a960 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
2a970 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69  o a IO method fi
2a980 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a  nder function:.*
2a990 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20  /.typedef const 
2a9a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a9b0 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70  ds *(*finder_typ
2a9c0 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  e)(const char*,u
2a9d0 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a  nixFile*);.../**
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2aa30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa40 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
2aa50 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
2aa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa70 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
2aa80 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
2aa90 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
2aaa0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
2aab0 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
2aac0 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
2aad0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ..*/../*.** Init
2aae0 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65  ialize the conte
2aaf0 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  nts of the unixF
2ab00 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  ile structure po
2ab10 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e  inted to by pId.
2ab20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2ab30 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20  illInUnixFile(. 
2ab40 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2ab50 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  fs,      /* Poin
2ab60 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
2ab70 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  t */.  int h,   
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ab90 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
2aba0 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
2abb0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
2abc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2abd0 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74  Id,      /* Writ
2abe0 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c  e to the unixFil
2abf0 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  e structure here
2ac00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2ac10 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
2ac20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
2ac30 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2ac40 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67  /.  int ctrlFlag
2ac50 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a  s           /* Z
2ac60 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58  ero or more UNIX
2ac70 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  FILE_* values */
2ac80 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  .){.  const sqli
2ac90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2aca0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2acb0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
2acc0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
2acd0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
2ace0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2acf0 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  rt( pNew->pInode
2ad00 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
2ad10 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68  Usually the path
2ad20 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c   zFilename shoul
2ad30 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74  d not be a relat
2ad40 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68  ive pathname. Th
2ad50 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e  e.  ** exception
2ad60 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   is when opening
2ad70 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63   the proxy "conc
2ad80 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64  h" file in build
2ad90 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c  s that.  ** incl
2ada0 75 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  ude the special 
2adb0 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74  Apple locking st
2adc0 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64  yles..  */.#if d
2add0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2ade0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2adf0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2ae00 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
2ae10 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
2ae20 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20  name[0]=='/' .  
2ae30 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44    || pVfs->pAppD
2ae40 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74  ata==(void*)&aut
2ae50 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b  olockIoFinder );
2ae60 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28  .#else.  assert(
2ae70 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
2ae80 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
2ae90 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  /' );.#endif..  
2aea0 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63  /* No locking oc
2aeb0 63 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  curs in temporar
2aec0 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73  y files */.  ass
2aed0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2aee0 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20  0 || (ctrlFlags 
2aef0 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  & UNIXFILE_NOLOC
2af00 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52  K)!=0 );..  OSTR
2af10 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d  ACE(("OPEN    %-
2af20 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69  3d %s\n", h, zFi
2af30 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77  lename));.  pNew
2af40 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d  ->h = h;.  pNew-
2af50 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
2af60 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46  pNew->zPath = zF
2af70 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d  ilename;.  pNew-
2af80 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38  >ctrlFlags = (u8
2af90 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20  )ctrlFlags;.#if 
2afa0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
2afb0 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d  SIZE>0.  pNew->m
2afc0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c  mapSizeMax = sql
2afd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2afe0 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a  .szMmap;.#endif.
2aff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
2b000 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c  i_boolean(((ctrl
2b010 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2b020 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d  _URI) ? zFilenam
2b030 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20  e : 0),.        
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54     "psow", SQLIT
2b060 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
2b070 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e  WRITE) ){.    pN
2b080 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2b090 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a   UNIXFILE_PSOW;.
2b0a0 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70    }.  if( strcmp
2b0b0 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e  (pVfs->zName,"un
2b0c0 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a  ix-excl")==0 ){.
2b0d0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2b0e0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2b0f0 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  EXCL;.  }..#if O
2b100 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
2b110 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
2b120 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
2b130 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
2b140 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
2b150 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2b160 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
2b170 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2b180 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
2b190 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73  .  if( ctrlFlags
2b1a0 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
2b1b0 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  CK ){.    pLocki
2b1c0 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
2b1d0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
2b1e0 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
2b1f0 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
2b200 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
2b210 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
2b220 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
2b230 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b240 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
2b250 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
2b260 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
2b270 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
2b280 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
2b290 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
2b2a0 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
2b2b0 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
2b2c0 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
2b2d0 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
2b2e0 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
2b2f0 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
2b300 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
2b310 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
2b320 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
2b330 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2b340 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
2b350 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
2b360 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
2b370 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
2b380 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e  ethods.#if defin
2b390 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2b3a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b3b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2b3c0 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
2b3d0 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f  e == &nfsIoMetho
2b3e0 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ds.#endif.  ){. 
2b3f0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2b400 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2b410 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2b420 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2b430 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b450 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2b460 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64  occurred in find
2b470 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
2b480 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2b490 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
2b4a0 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
2b4b0 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
2b4c0 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
2b4d0 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
2b4e0 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
2b4f0 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
2b500 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
2b510 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
2b520 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
2b530 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
2b540 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
2b550 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2b560 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
2b570 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
2b580 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
2b590 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
2b5a0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
2b5b0 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
2b5c0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
2b5d0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
2b5e0 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
2b5f0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
2b600 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
2b610 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
2b620 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
2b630 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
2b640 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
2b650 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
2b660 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
2b670 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
2b680 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
2b690 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2b6a0 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
2b6b0 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
2b6c0 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
2b6d0 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
2b6e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2b6f0 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
2b700 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
2b710 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
2b720 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
2b730 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
2b740 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
2b750 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
2b760 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
2b770 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
2b780 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
2b790 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
2b7a0 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
2b7b0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
2b7c0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2b7d0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2b7e0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2b7f0 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
2b800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
2b810 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2b820 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2b830 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2b840 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2b850 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
2b860 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2b870 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
2b880 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
2b890 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2b8a0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2b8b0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2b8c0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2b8d0 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
2b8e0 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
2b8f0 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
2b900 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
2b910 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2b920 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
2b930 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
2b940 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20  zeof(*pCtx) );. 
2b950 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29     if( pCtx==0 )
2b960 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2b970 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2b980 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
2b990 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
2b9a0 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
2b9b0 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
2b9c0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
2b9d0 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
2b9e0 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
2b9f0 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
2ba00 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
2ba10 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
2ba20 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
2ba30 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
2ba40 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
2ba50 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
2ba60 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
2ba70 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
2ba80 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
2ba90 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2baa0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2bab0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2bac0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2bad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2baf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2bb00 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2bb10 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
2bb20 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2bb30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2bb40 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2bb50 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
2bb60 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
2bb70 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
2bb80 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
2bb90 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2bba0 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
2bbb0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
2bbc0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
2bbd0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2bbe0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2bbf0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2bc00 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
2bc10 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
2bc20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
2bc30 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
2bc40 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
2bc50 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69  .    assert( zFi
2bc60 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  lename!=0 );.   
2bc70 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
2bc80 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
2bc90 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
2bca0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
2bcb0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2bcc0 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
2bcd0 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
2bce0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2bcf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2bd00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2bd10 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2bd20 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
2bd30 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
2bd40 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
2bd50 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2bd60 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2bd70 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
2bd80 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
2bd90 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
2bda0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2bdb0 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
2bdc0 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
2bdd0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
2bde0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2bdf0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2be00 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
2be10 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
2be20 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
2be30 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
2be40 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2be50 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2be60 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2be70 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
2be80 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
2be90 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
2bea0 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
2beb0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2bec0 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
2bed0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2bee0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
2bef0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2bf00 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
2bf10 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
2bf20 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
2bf50 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
2bf60 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
2bf70 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
2bf80 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
2bf90 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
2bfa0 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
2bfb0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
2bfc0 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
2bfd0 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
2bfe0 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
2bff0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2c000 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2c010 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
2c020 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c030 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2c040 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2c050 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
2c060 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
2c070 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2c080 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
2c090 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
2c0a0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
2c0b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2c0c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c0d0 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2c0e0 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2c0f0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2c100 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2c110 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2c120 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  lename);.    pNe
2c130 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2c140 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
2c150 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2c160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c170 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2c180 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2c190 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2c1a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c1b0 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
2c1c0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2c1d0 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
2c1e0 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62  1);.    verifyDb
2c1f0 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  File(pNew);.  }.
2c200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c210 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2c220 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
2c230 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
2c240 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
2c250 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
2c260 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
2c270 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
2c280 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
2c290 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
2c2a0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2c2b0 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
2c2c0 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
2c2d0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
2c2e0 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
2c2f0 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
2c300 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
2c310 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
2c320 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
2c330 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20  ,.     0        
2c340 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74  /* List terminat
2c350 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73  or */.  };.  uns
2c360 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
2c370 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2c380 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c390 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72  ir = 0;..  azDir
2c3a0 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
2c3b0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
2c3c0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
2c3d0 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
2c3e0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
2c3f0 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a  DIR");.  if( !az
2c400 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73  Dirs[2] ) azDirs
2c410 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [2] = getenv("TM
2c420 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d  PDIR");.  for(i=
2c430 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
2c440 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
2c450 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
2c460 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66  rs[i++]){.    if
2c470 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
2c480 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2c490 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29  Stat(zDir, &buf)
2c4a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c4b0 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
2c4c0 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
2c4d0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2c4e0 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37  sAccess(zDir, 07
2c4f0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2c500 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
2c510 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f  eturn zDir;.}../
2c520 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
2c530 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
2c540 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
2c550 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
2c560 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  ed.** by the cal
2c570 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64  ling process and
2c580 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
2c590 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ugh to hold at l
2c5a0 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78  east.** pVfs->mx
2c5b0 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a  Pathname bytes..
2c5c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2c5d0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
2c5e0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2c5f0 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  uf){.  static co
2c600 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2c610 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
2c620 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
2c630 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
2c640 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
2c650 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
2c660 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
2c670 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
2c680 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68  i, j;.  const ch
2c690 61 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20  ar *zDir;..  /* 
2c6a0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2c6b0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2c6c0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2c6d0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2c6e0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2c6f0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2c700 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2c710 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2c720 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2c730 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2c740 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
2c750 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2c760 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2c770 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2c780 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28  FileDir();.  if(
2c790 20 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20   zDir==0 ) zDir 
2c7a0 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65  = ".";..  /* Che
2c7b0 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
2c7c0 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
2c7d0 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
2c7e0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2c7f0 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
2c800 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
2c810 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
2c820 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c    */.  if( (strl
2c830 65 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65  en(zDir) + strle
2c840 6e 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  n(SQLITE_TEMP_FI
2c850 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29  LE_PREFIX) + 18)
2c860 20 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66   >= (size_t)nBuf
2c870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c880 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2c890 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ..  do{.    sqli
2c8a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2c8b0 66 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f  f-18, zBuf, "%s/
2c8c0 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
2c8d0 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b  E_PREFIX, zDir);
2c8e0 0a 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74  .    j = (int)st
2c8f0 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
2c900 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2c910 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
2c920 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c930 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
2c940 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20        zBuf[j] = 
2c950 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
2c960 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
2c970 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
2c980 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20  Chars)-1) ];.   
2c990 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d   }.    zBuf[j] =
2c9a0 20 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31   0;.    zBuf[j+1
2c9b0 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
2c9c0 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30   osAccess(zBuf,0
2c9d0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2c9e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2c9f0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2ca00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2ca10 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2ca20 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  E__)./*.** Routi
2ca30 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ne to transform 
2ca40 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20  a unixFile into 
2ca50 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  a proxy-locking 
2ca60 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70  unixFile..** Imp
2ca70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74  lementation in t
2ca80 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69  he proxy-lock di
2ca90 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64  vision, but used
2caa0 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a   by unixOpen().*
2cab0 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  * if SQLITE_PREF
2cac0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2cad0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
2cae0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2caf0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
2cb00 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e  e(unixFile*, con
2cb10 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69  st char*);.#endi
2cb20 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  f../*.** Search 
2cb30 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2cb40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
2cb50 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  at was opened on
2cb60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
2cb70 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  * file (not a jo
2cb80 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d  urnal or master-
2cb90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64  journal file) id
2cba0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68  entified by path
2cbb0 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69  name.** zPath wi
2cbc0 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  th SQLITE_OPEN_X
2cbd0 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e  XX flags matchin
2cbe0 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61  g those passed a
2cbf0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
2cc00 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2cc10 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2cc20 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73   Such a file des
2cc30 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73  criptor may exis
2cc40 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  t if a database 
2cc50 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63  connection was c
2cc60 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65  losed.** but the
2cc70 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
2cc80 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c   descriptor coul
2cc90 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  d not be closed 
2cca0 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20  because some.** 
2ccb0 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
2ccc0 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  iptor open on th
2ccd0 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68  e same file is h
2cce0 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f  olding a file-lo
2ccf0 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20  ck..** Refer to 
2cd00 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
2cd10 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63  unixClose() func
2cd20 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e  tion and the len
2cd30 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20  gthy comment.** 
2cd40 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69  describing "Posi
2cd50 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
2cd60 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74  ng" at the start
2cd70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f   of this file fo
2cd80 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65  r .** further de
2cd90 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63  tails. Also, tic
2cda0 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a  ket #4018..**.**
2cdb0 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66   If a suitable f
2cdc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2cdd0 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74  s found, then it
2cde0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2cdf0 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65   no.** such file
2ce00 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c   descriptor is l
2ce10 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65  ocated, -1 is re
2ce20 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2ce30 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  c UnixUnusedFd *
2ce40 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63  findReusableFd(c
2ce50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2ce60 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2ce70 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2ce80 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nused = 0;..  /*
2ce90 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66   Do not search f
2cea0 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
2ceb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
2cec0 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63  vxworks. Not bec
2ced0 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b  ause.  ** vxwork
2cee0 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65  s would not bene
2cef0 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61  fit from the cha
2cf00 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77  nge (it might, w
2cf10 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a  e're not sure),.
2cf20 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65    ** but because
2cf30 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20   no way to test 
2cf40 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2cf50 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73  available. It is
2cf60 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f   better .  ** no
2cf70 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69  t to risk breaki
2cf80 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f  ng vxworks suppo
2cf90 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20  rt for the sake 
2cfa0 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75  of such an obscu
2cfb0 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65  re .  ** feature
2cfc0 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58  .  */.#if !OS_VX
2cfd0 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73  WORKS.  struct s
2cfe0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d000 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28  Results of stat(
2d010 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ) call */..  /* 
2d020 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61  A stat() call ma
2d030 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f  y fail for vario
2d040 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74  us reasons. If t
2d050 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20  his happens, it 
2d060 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63  is.  ** almost c
2d070 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f  ertain that an o
2d080 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68  pen() call on th
2d090 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c  e same path will
2d0a0 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a   also fail..  **
2d0b0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
2d0c0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
2d0d0 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74  curs in the stat
2d0e0 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74  () call here, it
2d0f0 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64   is.  ** ignored
2d100 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72   and -1 is retur
2d110 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
2d120 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e  will try to open
2d130 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a   a new file.  **
2d140 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74   descriptor on t
2d150 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61  he same path, fa
2d160 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  il, and return a
2d170 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74  n error to SQLit
2d180 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65  e..  **.  ** Eve
2d190 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  n if a subsequen
2d1a0 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f  t open() call do
2d1b0 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20  es succeed, the 
2d1c0 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a  consequences of.
2d1d0 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69    ** not searchi
2d1e0 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62  ng for a resusab
2d1f0 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2d200 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
2d210 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73    */.  if( 0==os
2d220 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
2d230 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
2d240 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
2d250 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ;..    unixEnter
2d260 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e  Mutex();.    pIn
2d270 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
2d280 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
2d290 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
2d2a0 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
2d2b0 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2d2d0 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
2d2e0 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f  no!=sStat.st_ino
2d2f0 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f  ) ){.       pIno
2d300 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
2d310 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
2d320 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
2d330 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2d340 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
2d350 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  p=&pInode->pUnus
2d360 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29  ed; *pp && (*pp)
2d370 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20  ->flags!=flags; 
2d380 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
2d390 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73  t));.      pUnus
2d3a0 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20  ed = *pp;.      
2d3b0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2d3c0 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e         *pp = pUn
2d3d0 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  used->pNext;.   
2d3e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2d3f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d400 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  .  }.#endif    /
2d410 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  * if !OS_VXWORKS
2d420 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e   */.  return pUn
2d430 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  used;.}../*.** T
2d440 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d450 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70  called by unixOp
2d460 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  en() to determin
2d470 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69  e the unix permi
2d480 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65  ssions.** to cre
2d490 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69  ate new files wi
2d4a0 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  th. If no error 
2d4b0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2d4c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d4d0 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75  ed.** and a valu
2d4e0 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70  e suitable for p
2d4f0 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68  assing as the th
2d500 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2d510 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72  open(2) is.** wr
2d520 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e  itten to *pMode.
2d530 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2d540 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
2d550 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2d560 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
2d570 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
2d580 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69  Mode is not modi
2d590 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d  fied..**.** In m
2d5a0 6f 73 74 20 63 61 73 65 73 20 63 61 73 65 73 2c  ost cases cases,
2d5b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
2d5c0 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20  ts *pMode to 0, 
2d5d0 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d  which will becom
2d5e0 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69  e.** an indicati
2d5f0 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65  on to robust_ope
2d600 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68  n() to create th
2d610 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20  e file using.** 
2d620 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2d630 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
2d640 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20  adjusted by the 
2d650 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66  umask..** But if
2d660 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2d670 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2d680 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2d690 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2d6a0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2d6b0 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2d6c0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2d6d0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2d6e0 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2d6f0 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2d700 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2d710 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2d720 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2d730 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2d740 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2d750 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2d760 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2d770 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2d780 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2d790 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2d7a0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2d7b0 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2d7c0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2d7d0 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2d7e0 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2d7f0 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2d800 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2d810 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2d820 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2d830 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2d840 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2d850 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2d860 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2d870 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2d880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2d890 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2d8a0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2d8b0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2d8c0 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2d8d0 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2d8e0 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2d8f0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d910 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2d920 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2d930 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2d940 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2d950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d960 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2d970 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2d980 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2d990 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d9b0 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2d9c0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2d9d0 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9f0 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2da00 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2da10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2da20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2da30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2da40 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2da50 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64  ode = 0;.  *pUid
2da60 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20   = 0;.  *pGid = 
2da70 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  0;.  if( flags &
2da80 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2da90 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2daa0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2dab0 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f     char zDb[MAX_
2dac0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20  PATHNAME+1];    
2dad0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
2dae0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
2daf0 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20  t nDb;          
2db00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2db10 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62  umber of valid b
2db20 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20  ytes in zDb */. 
2db30 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
2db40 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2db50 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74   /* Output of st
2db60 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65  at() on database
2db70 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
2db80 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68   zPath is a path
2db90 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75   to a WAL or jou
2dba0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66  rnal file. The f
2dbb0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
2dbc0 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68  erives.    ** th
2dbd0 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73  e path to the as
2dbe0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2dbf0 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74  e file from zPat
2dc00 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  h. This block ha
2dc10 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  ndles.    ** the
2dc20 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e   following namin
2dc30 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20  g conventions:. 
2dc40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22     **.    **   "
2dc50 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2dc60 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  rnal".    **   "
2dc70 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
2dc80 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2dc90 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2dca0 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  NN".    **   "<p
2dcb0 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e  ath to db>-walNN
2dcc0 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
2dcd0 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65  where NN is a de
2dce0 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68  cimal number. Th
2dcf0 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65  e NN naming sche
2dd00 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  mes are .    ** 
2dd10 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
2dd20 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64  _multiplex.c mod
2dd30 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ule..    */.    
2dd40 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nDb = sqlite3Str
2dd50 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31  len30(zPath) - 1
2dd60 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ; .#ifdef SQLITE
2dd70 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
2dd80 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62  S.    while( nDb
2dd90 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61  >0 && sqlite3Isa
2dda0 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29  lnum(zPath[nDb])
2ddb0 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66   ) nDb--;.    if
2ddc0 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74  ( nDb==0 || zPat
2ddd0 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65  h[nDb]!='-' ) re
2dde0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ddf0 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
2de00 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2de10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2de20 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20  ( nDb>0 );.     
2de30 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e   assert( zPath[n
2de40 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20  Db]!='\n' );.   
2de50 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a     nDb--;.    }.
2de60 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70  #endif.    memcp
2de70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
2de80 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
2de90 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
2dea0 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c  ( 0==osStat(zDb,
2deb0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2dec0 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74    *pMode = sStat
2ded0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b  .st_mode & 0777;
2dee0 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73  .      *pUid = s
2def0 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20  Stat.st_uid;.   
2df00 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74     *pGid = sStat
2df10 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c  .st_gid;.    }el
2df20 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2df30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
2df40 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  T;.    }.  }else
2df50 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2df60 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2df70 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70  NCLOSE ){.    *p
2df80 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d  Mode = 0600;.  }
2df90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dfa0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
2dfb0 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
2dfc0 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
2dfd0 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
2dfe0 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
2dff0 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
2e000 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
2e010 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
2e020 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
2e030 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
2e040 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
2e050 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
2e060 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
2e070 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
2e080 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
2e090 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
2e0a0 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
2e0b0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
2e0c0 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
2e0d0 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
2e0e0 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
2e0f0 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
2e100 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
2e110 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
2e120 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
2e130 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2e140 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
2e150 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
2e160 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
2e170 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
2e180 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
2e190 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
2e1a0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
2e1b0 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
2e1c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2e1d0 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
2e1e0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
2e1f0 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
2e200 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
2e210 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
2e220 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
2e230 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
2e240 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
2e250 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
2e260 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
2e270 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
2e280 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
2e290 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2e2a0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2e2b0 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
2e2c0 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
2e2d0 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
2e2e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2e2f0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2e300 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
2e310 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
2e320 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2e330 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
2e340 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
2e350 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
2e360 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
2e370 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e390 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
2e3a0 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
2e3b0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
2e3c0 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
2e3d0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2e3e0 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
2e3f0 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
2e400 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
2e410 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
2e420 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
2e430 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
2e440 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2e450 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
2e460 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
2e470 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
2e480 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e490 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
2e4a0 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
2e4b0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
2e4c0 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
2e4d0 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
2e4e0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2e4f0 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
2e500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e510 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
2e520 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
2e530 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2e540 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2e550 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2e560 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2e570 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
2e580 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e590 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
2e5a0 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
2e5b0 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
2e5c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e5d0 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
2e5e0 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
2e5f0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2e600 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2e610 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
2e620 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
2e630 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e640 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
2e650 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
2e660 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e670 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2e680 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
2e690 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2e6a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2e6b0 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
2e6c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e6d0 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
2e6e0 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
2e6f0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e700 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
2e710 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
2e720 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2e730 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2e740 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
2e750 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
2e760 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2e770 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
2e780 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
2e790 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
2e7a0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
2e7b0 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
2e7c0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
2e7d0 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
2e7e0 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
2e7f0 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
2e800 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
2e810 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2e820 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
2e830 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
2e840 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
2e850 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
2e860 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
2e870 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e880 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2e890 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2e8a0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2e8b0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
2e8c0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2e8d0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
2e8e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2e8f0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
2e900 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
2e910 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
2e920 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
2e930 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
2e940 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
2e950 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
2e960 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
2e970 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
2e980 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
2e990 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+2];.  const c
2e9a0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
2e9b0 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
2e9c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2e9d0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
2e9e0 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
2e9f0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
2ea00 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
2ea10 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
2ea20 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
2ea30 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
2ea40 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
2ea50 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
2ea60 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2ea70 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
2ea80 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
2ea90 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2eaa0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2eab0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
2eac0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
2ead0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
2eae0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
2eaf0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
2eb00 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
2eb10 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
2eb20 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
2eb30 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
2eb40 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
2eb50 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
2eb60 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
2eb70 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
2eb80 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
2eb90 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2eba0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
2ebb0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
2ebc0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
2ebd0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
2ebe0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
2ebf0 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
2ec00 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2ec10 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
2ec20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
2ec30 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
2ec40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
2ec50 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2ec60 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2ec70 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2ec80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2ec90 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2eca0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2ecb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2ecc0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2ecd0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ece0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2ecf0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2ed00 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
2ed10 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2ed20 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2ed30 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2ed40 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
2ed50 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
2ed60 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
2ed70 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
2ed80 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
2ed90 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
2eda0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2edb0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
2edc0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2edd0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
2ede0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2edf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2ee00 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
2ee10 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2ee20 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
2ee30 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2ee40 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2ee50 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
2ee60 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2ee70 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2ee80 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2ee90 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
2eea0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
2eeb0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2eec0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  .  );..  /* Dete
2eed0 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20  ct a pid change 
2eee0 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52  and reset the PR
2eef0 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  NG.  There is a 
2ef00 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  race condition. 
2ef10 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68   ** here such th
2ef20 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  at two or more t
2ef30 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e  hreads all tryin
2ef40 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  g to open databa
2ef50 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ses at.  ** the 
2ef60 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67  same instant mig
2ef70 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65  ht all reset the
2ef80 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74   PRNG.  But mult
2ef90 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a  iple resets.  **
2efa0 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20   are harmless.. 
2efb0 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d   */.  if( random
2efc0 6e 65 73 73 50 69 64 21 3d 67 65 74 70 69 64 28  nessPid!=getpid(
2efd0 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e  ) ){.    randomn
2efe0 65 73 73 50 69 64 20 3d 20 67 65 74 70 69 64 28  essPid = getpid(
2eff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2f000 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
2f010 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c    }..  memset(p,
2f020 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
2f030 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
2f040 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f050 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
2f060 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2f070 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
2f080 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
2f090 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
2f0a0 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
2f0b0 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
2f0c0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
2f0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2f0e0 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
2f0f0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
2f100 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
2f110 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
2f120 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2f140 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2f150 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  p->pUnused = pUn
2f160 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61  used;..    /* Da
2f170 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
2f180 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
2f190 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
2f1a0 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  hey are not.    
2f1b0 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
2f1c0 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
2f1d0 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
2f1e0 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
2f1f0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
2f200 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
2f210 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
2f220 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2f230 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d  PEN_URI) || zNam
2f240 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  e[strlen(zName)+
2f250 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73  1]==0 );..  }els
2f260 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a  e if( !zName ){.
2f270 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2f280 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70  is NULL, the upp
2f290 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75  er layer is requ
2f2a0 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69  esting a temp fi
2f2b0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
2f2c0 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73  t(isDelete && !s
2f2d0 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20  yncDir);.    rc 
2f2e0 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
2f2f0 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e(MAX_PATHNAME+2
2f300 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
2f310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f320 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2f330 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2f340 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
2f350 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  e;..    /* Gener
2f360 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  ated temporary f
2f370 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77  ilenames are alw
2f380 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  ays double-zero 
2f390 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a  terminated.    *
2f3a0 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c  * for use by sql
2f3b0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
2f3c0 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73  er(). */.    ass
2f3d0 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65  ert( zName[strle
2f3e0 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  n(zName)+1]==0 )
2f3f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
2f400 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
2f410 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
2f420 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
2f430 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
2f440 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
2f450 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
2f460 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
2f470 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
2f480 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
2f490 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2f4a0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
2f4b0 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
2f4c0 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
2f4d0 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
2f4e0 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
2f4f0 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
2f500 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2f510 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2f520 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
2f530 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
2f540 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
2f550 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
2f560 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
2f570 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
2f580 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
2f590 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
2f5a0 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
2f5b0 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
2f5c0 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
2f5d0 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
2f5e0 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
2f5f0 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
2f600 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
2f610 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
2f620 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
2f630 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20     uid_t uid;   
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74   /* Userid for t
2f660 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67  he file */.    g
2f670 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20  id_t gid;       
2f680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f690 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20  Groupid for the 
2f6a0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
2f6b0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
2f6c0 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  ode(zName, flags
2f6d0 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
2f6e0 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66  d, &gid);.    if
2f6f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f700 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2f710 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a   !p->pUnused );.
2f720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2f730 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f740 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  _WAL || eType==S
2f750 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2f760 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20  JOURNAL );.     
2f770 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f780 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  }.    fd = robus
2f790 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
2f7a0 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
2f7b0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
2f7c0 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
2f7d0 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
2f7e0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29  ame, openFlags))
2f7f0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
2f800 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20  & errno!=EISDIR 
2f810 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20 26  && isReadWrite &
2f820 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
2f830 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65  {.      /* Faile
2f840 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
2f850 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
2f860 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
2f870 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
2f880 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
2f890 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2f8a0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
2f8b0 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70  REATE);.      op
2f8c0 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52  enFlags &= ~(O_R
2f8d0 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20  DWR|O_CREAT);.  
2f8e0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
2f8f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2f900 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  Y;.      openFla
2f910 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
2f920 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
2f930 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d   = 1;.      fd =
2f940 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
2f950 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
2f960 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  penMode);.    }.
2f970 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
2f980 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
2f990 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2f9a0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
2f9b0 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  pen", zName);.  
2f9c0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2f9d0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  nished;.    }.. 
2f9e0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
2f9f0 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
2fa00 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20   as root and if 
2fa10 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72  creating a new r
2fa20 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2fa30 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69  ournal or WAL fi
2fa40 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65  le, set the owne
2fa50 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75  rship of the jou
2fa60 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62  rnal or WAL to b
2fa70 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
2fa80 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  e as the origina
2fa90 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  l database..    
2faa0 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
2fab0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
2fac0 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
2fad0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
2fae0 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
2faf0 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
2fb00 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2fb10 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
2fb20 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
2fb30 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
2fb40 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
2fb50 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a  ( p->pUnused ){.
2fb60 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
2fb70 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
2fb80 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
2fb90 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
2fba0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
2fbb0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2fbc0 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
2fbd0 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c  .#else.    osUnl
2fbe0 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64  ink(zName);.#end
2fbf0 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  if.  }.#if SQLIT
2fc00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2fc10 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20  _STYLE.  else{. 
2fc20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20     p->openFlags 
2fc30 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d  = openFlags;.  }
2fc40 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63  .#endif..  noLoc
2fc50 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
2fc60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
2fc70 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
2fc80 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
2fc90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2fca0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20  ING_STYLE.  if( 
2fcb0 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49  fstatfs(fd, &fsI
2fcc0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
2fcd0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
2fce0 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  ile)->lastErrno 
2fcf0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62  = errno;.    rob
2fd00 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2fd10 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2fd20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2fd30 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
2fd40 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
2fd50 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
2fd60 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2fd70 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
2fd80 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
2fd90 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2fda0 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
2fdb0 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  S;.  }.#endif.. 
2fdc0 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f   /* Set up appro
2fdd0 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73  priate ctrlFlags
2fde0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65   */.  if( isDele
2fdf0 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20  te )            
2fe00 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
2fe10 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
2fe20 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
2fe30 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ly )            
2fe40 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2fe50 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  NIXFILE_RDONLY;.
2fe60 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20    if( noLock )  
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe80 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2fe90 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
2fea0 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20  if( syncDir )   
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
2fec0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2fed0 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69  ILE_DIRSYNC;.  i
2fee0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
2fef0 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72  E_OPEN_URI ) ctr
2ff00 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2ff10 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c  LE_URI;..#if SQL
2ff20 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ff30 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c  NG_STYLE.#if SQL
2ff40 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2ff50 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
2ff60 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
2ff70 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  if.  if( isAutoP
2ff80 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
2ff90 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
2ffa0 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
2ffb0 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
2ffc0 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
2ffd0 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
2ffe0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
2fff0 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
30000 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
30010 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
30020 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
30030 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
30040 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
30050 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
30060 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
30070 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
30080 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
30090 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
300a0 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
300b0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
300c0 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
300d0 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
300e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
300f0 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66  statfs(zPath, &f
30100 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
30110 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
30120 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28  eory, the close(
30130 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d  fd) call is sub-
30140 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20  optimal. If the 
30150 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20  file opened.    
30160 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69      ** with fd i
30170 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
30180 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
30190 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
301a0 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  ns open.        
301b0 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ** on that file 
301c0 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
301d0 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73  ly holding advis
301e0 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c  ory locks on it,
301f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
30200 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f   the call to clo
30210 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c  se() will cancel
30220 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e   those locks. In
30230 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20   practice,.     
30240 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75     ** we're assu
30250 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73  ming that statfs
30260 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20  () doesn't fail 
30270 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c  very often. At l
30280 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  east.        ** 
30290 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20  not while other 
302a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
302b0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
302c0 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20  ame process on. 
302d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61         ** the sa
302e0 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b  me file are work
302f0 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ing.  */.       
30300 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20   p->lastErrno = 
30310 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
30320 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
30330 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
30340 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30350 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
30360 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65          goto ope
30370 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
30380 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f    }.      usePro
30390 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f  xy = !(fsInfo.f_
303a0 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29  flags&MNT_LOCAL)
303b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
303c0 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  useProxy ){.    
303d0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
303e0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
303f0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
30400 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  rlFlags);.      
30410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30420 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
30430 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  = proxyTransform
30440 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69  UnixFile((unixFi
30450 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74  le*)pFile, ":aut
30460 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  o:");.        if
30470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
30490 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f  Use unixClose to
304a0 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
304b0 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e  sources added in
304c0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20   fillInUnixFile 
304d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
304e0 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20  d clear all the 
304f0 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65  structure's refe
30500 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69  rences.  Specifi
30510 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20  cally, .        
30520 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74    ** pFile->pMet
30530 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c  hods will be NUL
30540 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c  L so sqlite3OsCl
30550 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ose will be a no
30560 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a  -op .          *
30570 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  /.          unix
30580 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20  Close(pFile);.  
30590 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
305a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
305b0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
305c0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
305d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
305e0 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
305f0 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
30600 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
30610 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70   ctrlFlags);..op
30620 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  en_finished:.  i
30630 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30650 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29  free(p->pUnused)
30660 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
30670 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
30680 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
30690 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
306a0 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
306b0 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
306c0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
306d0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
306e0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
306f0 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
30700 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
30710 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
30720 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
30730 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
30740 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
30750 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
30760 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
30770 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
30780 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
30790 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
307a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
307b0 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
307c0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
307d0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
307e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
307f0 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
30800 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30810 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
30820 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
30830 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
30840 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e  );.  if( osUnlin
30850 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29  k(zPath)==(-1) )
30860 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d  {.    if( errno=
30870 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
30880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
30890 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
308a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
308b0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
308c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
308d0 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
308e0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
308f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30900 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
30910 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
30920 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
30930 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
30940 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
30950 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
30960 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
30970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30980 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
30990 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
309a0 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
309b0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
309c0 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
309d0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
309e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
309f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
30a00 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
30a10 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
30a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
30a30 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
30a40 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
30a50 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
30a60 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
30a70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30a80 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
30a90 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
30aa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
30ab0 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  st the existence
30ac0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
30ad0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
30ae0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
30af0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
30b00 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
30b10 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
30b20 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
30b30 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
30b40 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
30b50 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
30b60 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
30b70 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
30b80 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
30b90 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
30ba0 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
30bb0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
30bc0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
30bd0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
30be0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
30bf0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
30c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30c10 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
30c20 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30c30 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
30c40 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
30c50 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
30c60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30c70 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
30c80 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
30c90 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
30ca0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
30cb0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
30cc0 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
30cd0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
30ce0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
30cf0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
30d00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
30d10 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
30d20 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
30d30 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53  mode = 0;.  UNUS
30d40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30d50 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
30d60 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
30d70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
30d80 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63  CESS; );.  switc
30d90 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
30da0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30db0 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
30dc0 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20   amode = F_OK;. 
30dd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30de0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30df0 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
30e00 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b      amode = W_OK
30e10 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  |R_OK;.      bre
30e20 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
30e30 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
30e40 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52  .      amode = R
30e50 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
30e60 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
30e70 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49        assert(!"I
30e80 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
30e90 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a  ument");.  }.  *
30ea0 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63  pResOut = (osAcc
30eb0 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65  ess(zPath, amode
30ec0 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61  )==0);.  if( fla
30ed0 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
30ee0 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65  S_EXISTS && *pRe
30ef0 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75  sOut ){.    stru
30f00 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
30f10 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
30f20 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
30f30 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b  uf.st_size==0 ){
30f40 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20  .      *pResOut 
30f50 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
30f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30f70 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  K;.}.../*.** Tur
30f80 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
30f90 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
30fa0 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
30fb0 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
30fc0 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
30fd0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
30fe0 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
30ff0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
31000 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
31010 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
31020 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
31030 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
31040 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
31050 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
31060 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
31070 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
31080 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
31090 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
310a0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
310b0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
310c0 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
310d0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
310e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
310f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
31100 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
31110 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
31120 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
31130 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
31140 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
31150 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
31160 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
31170 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
31180 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
31190 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
311a0 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311c0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
311d0 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  .){..  /* It's o
311e0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
311f0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
31200 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
31210 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
31220 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
31230 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
31240 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
31250 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
31260 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
31270 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
31280 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
31290 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
312a0 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
312b0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
312c0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
312d0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
312e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
312f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31300 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
31310 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
31320 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
31330 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
31340 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
31350 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20   zOut[nOut-1] = 
31360 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74  '\0';.  if( zPat
31370 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  h[0]=='/' ){.   
31380 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31390 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
313a0 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65  s", zPath);.  }e
313b0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77  lse{.    int nCw
313c0 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  d;.    if( osGet
313d0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  cwd(zOut, nOut-1
313e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
313f0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
31400 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
31410 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
31420 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31430 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29      nCwd = (int)
31440 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20  strlen(zOut);.  
31450 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31460 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a  tf(nOut-nCwd, &z
31470 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22  Out[nCwd], "/%s"
31480 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  , zPath);.  }.  
31490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
314a0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
314b0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
314c0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
314d0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
314e0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
314f0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
31500 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
31510 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
31520 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
31530 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
31540 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
31550 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
31560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
31570 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
31580 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
31590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
315a0 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
315b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
315c0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
315d0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
315e0 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
315f0 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
31600 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
31610 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
31620 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
31630 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
31640 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
31650 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
31660 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
31670 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
31680 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
31690 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
316a0 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
316b0 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
316c0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
316d0 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
316e0 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
316f0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
31700 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
31710 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
31720 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
31730 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
31740 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
31750 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31760 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
31770 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
31780 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
31790 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
317a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
317b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
317c0 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
317d0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
317e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
317f0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
31800 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
31810 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
31820 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
31830 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
31840 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
31850 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
31860 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
31870 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
31880 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
31890 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
318a0 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
318b0 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
318c0 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
318d0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
318e0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
318f0 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
31900 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
31910 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
31920 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
31930 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
31940 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31950 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
31960 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
31970 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
31980 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
31990 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
319a0 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
319b0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
319c0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
319d0 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
319e0 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
319f0 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
31a00 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
31a10 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
31a20 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
31a30 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
31a40 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
31a50 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
31a60 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
31a70 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
31a80 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
31a90 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
31aa0 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
31ab0 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
31ac0 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
31ad0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
31ae0 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
31af0 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
31b00 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
31b10 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
31b20 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
31b30 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
31b40 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
31b50 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
31b60 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
31b70 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
31b80 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
31b90 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
31ba0 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
31bb0 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
31bc0 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
31bd0 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
31be0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
31bf0 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
31c00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31c10 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
31c20 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
31c30 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
31c40 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
31c50 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
31c60 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
31c70 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
31c80 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
31c90 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
31ca0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
31cb0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31cc0 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
31cd0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
31ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
31cf0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
31d00 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
31d10 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
31d20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31d30 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
31d40 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
31d50 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31d60 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
31d70 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
31d80 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
31d90 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
31da0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
31db0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
31dc0 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
31dd0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
31de0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
31df0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
31e00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31e10 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
31e20 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
31e30 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
31e40 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
31e50 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
31e60 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
31e70 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
31e80 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
31e90 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
31ea0 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
31eb0 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
31ec0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
31ed0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
31ee0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
31ef0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
31f00 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
31f10 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
31f20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
31f30 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
31f40 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
31f50 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
31f60 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
31f70 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
31f80 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
31f90 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
31fa0 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
31fb0 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
31fc0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
31fd0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
31fe0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
31ff0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
32000 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
32010 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
32020 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
32030 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
32040 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
32050 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
32060 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
32070 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
32080 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
32090 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
320a0 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
320b0 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
320c0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
320d0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
320e0 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
320f0 20 67 65 74 70 69 64 28 29 3b 20 20 0a 23 69 66   getpid();  .#if
32100 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
32110 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69  _TEST).  {.    i
32120 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20  nt fd, got;.    
32130 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
32140 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
32150 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20   O_RDONLY, 0);. 
32160 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
32170 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20       time_t t;. 
32180 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20       time(&t);. 
32190 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
321a0 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29  , &t, sizeof(t))
321b0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
321c0 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c  zBuf[sizeof(t)],
321d0 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 2c   &randomnessPid,
321e0 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65   sizeof(randomne
321f0 73 73 50 69 64 29 29 3b 0a 20 20 20 20 20 20 61  ssPid));.      a
32200 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29  ssert( sizeof(t)
32210 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65  +sizeof(randomne
32220 73 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29  ssPid)<=(size_t)
32230 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42  nBuf );.      nB
32240 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b  uf = sizeof(t) +
32250 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65   sizeof(randomne
32260 73 73 50 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ssPid);.    }els
32270 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74  e{.      do{ got
32280 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42   = osRead(fd, zB
32290 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c  uf, nBuf); }whil
322a0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
322b0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
322c0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
322d0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
322e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
322f0 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  f.  return nBuf;
32300 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
32310 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
32320 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
32330 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
32340 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
32350 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
32360 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
32370 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
32380 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
32390 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
323a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
323b0 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
323c0 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
323d0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
323e0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
323f0 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
32400 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
32410 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
32420 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
32430 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
32440 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
32450 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
32460 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
32470 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
32480 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
32490 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
324a0 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  s){.#if OS_VXWOR
324b0 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
324c0 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74  spec sp;..  sp.t
324d0 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63  v_sec = microsec
324e0 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a  onds / 1000000;.
324f0 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28    sp.tv_nsec = (
32500 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31  microseconds % 1
32510 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a  000000) * 1000;.
32520 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c    nanosleep(&sp,
32530 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44   NULL);.  UNUSED
32540 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32550 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
32560 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
32570 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
32580 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
32590 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
325a0 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
325b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
325c0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
325d0 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
325e0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
325f0 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
32600 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
32610 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
32620 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
32630 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32640 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  sed);.  return s
32650 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
32660 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
32670 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
32680 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
32690 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
326a0 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
326b0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
326c0 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
326d0 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
326e0 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
326f0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
32700 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
32710 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
32720 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
32730 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
32740 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
32750 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
32760 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
32770 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
32780 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
32790 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
327a0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
327b0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
327c0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
327d0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
327e0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
327f0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
32800 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
32810 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
32820 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
32830 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
32840 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
32850 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
32860 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
32870 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
32880 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
32890 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
328a0 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
328b0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
328c0 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
328d0 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
328e0 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
328f0 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
32900 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
32910 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
32920 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a   time and date .
32930 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
32940 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
32950 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
32960 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
32970 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c  fs *NotUsed, sql
32980 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
32990 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  w){.  static con
329a0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
329b0 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
329c0 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
329d0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20  nt64)8640000;.  
329e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
329f0 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  OK;.#if defined(
32a00 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
32a10 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
32a20 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28  );.  *piNow = ((
32a30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
32a40 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63  *1000 + unixEpoc
32a50 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f  h;.#elif OS_VXWO
32a60 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
32a70 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c  espec sNow;.  cl
32a80 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43  ock_gettime(CLOC
32a90 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f  K_REALTIME, &sNo
32aa0 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75  w);.  *piNow = u
32ab0 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
32ac0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
32ad0 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
32ae0 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30  w.tv_nsec/100000
32af0 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
32b00 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
32b10 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64    if( gettimeofd
32b20 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20  ay(&sNow, 0)==0 
32b30 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
32b40 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
32b50 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
32b60 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
32b70 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
32b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
32b90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
32ba0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
32bb0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
32bc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
32bd0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
32be0 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
32bf0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
32c00 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
32c10 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
32c20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
32c30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32c40 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
32c50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
32c60 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
32c70 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
32c80 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
32c90 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
32ca0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
32cb0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
32cc0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
32cd0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
32ce0 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
32cf0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
32d00 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
32d10 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
32d20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32d30 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
32d40 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32d50 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
32d60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
32d70 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
32d80 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
32d90 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32da0 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
32db0 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
32dc0 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
32dd0 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
32de0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32df0 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
32e00 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
32e10 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
32e20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
32e30 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
32e40 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
32e50 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
32e60 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
32e70 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
32e80 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
32e90 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
32ea0 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
32eb0 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
32ec0 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
32ed0 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
32ee0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32ef0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
32f00 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
32f10 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
32f20 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
32f30 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
32f40 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
32f50 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
32f60 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
32f70 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
32f80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32f90 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
32fa0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32fb0 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
32fc0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32fd0 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
32fe0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
32ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33000 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
33010 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
33020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33030 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
33040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33080 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
33090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330d0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
330e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
330f0 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
33100 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
33110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33120 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
33130 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
33140 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
33150 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
33160 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
33170 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
33180 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
33190 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
331a0 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
331b0 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
331c0 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
331d0 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
331e0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
331f0 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
33200 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
33210 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
33220 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
33230 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
33240 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
33250 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
33260 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
33270 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
33280 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
33290 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
332a0 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
332b0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
332c0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
332d0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
332e0 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
332f0 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
33300 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
33310 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
33320 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
33330 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
33340 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
33350 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
33360 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
33370 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
33380 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
33390 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
333a0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
333b0 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
333c0 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
333d0 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
333e0 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
333f0 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
33400 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
33410 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
33420 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
33430 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
33440 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
33450 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
33460 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
33470 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
33480 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
33490 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
334a0 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
334b0 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
334c0 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
334d0 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
334e0 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
334f0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
33500 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
33510 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
33520 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
33530 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
33540 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
33550 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
33560 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
33570 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
33580 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
33590 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
335a0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
335b0 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
335c0 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
335d0 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
335e0 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
335f0 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
33600 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
33610 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45  000.**      RESE
33620 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
33630 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
33640 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
33650 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33660 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
33670 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
33680 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
33690 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
336a0 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
336b0 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
336c0 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
336d0 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
336e0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
336f0 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
33700 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
33710 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
33720 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
33730 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
33740 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
33750 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
33760 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
33770 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
33780 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
33790 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
337a0 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
337b0 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
337c0 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
337d0 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
337e0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
337f0 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
33800 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
33810 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
33820 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
33830 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
33840 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
33850 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
33860 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
33870 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
33880 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
33890 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
338a0 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
338b0 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
338c0 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
338d0 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
338e0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
338f0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
33900 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
33910 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
33920 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
33930 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
33940 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
33950 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
33960 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
33970 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
33980 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
33990 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
339a0 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
339b0 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
339c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
339d0 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
339e0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
339f0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
33a00 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
33a10 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
33a20 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
33a30 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
33a40 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
33a50 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
33a60 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
33a70 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
33a80 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
33a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33aa0 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
33ab0 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
33ac0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
33ad0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
33ae0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
33af0 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
33b00 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
33b10 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
33b20 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
33b30 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
33b40 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
33b50 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
33b60 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
33b70 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
33b80 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
33b90 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
33ba0 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
33bb0 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
33bc0 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
33bd0 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
33be0 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
33bf0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
33c00 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
33c10 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
33c20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
33c30 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
33c40 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
33c50 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
33c60 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
33c70 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
33c80 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
33c90 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
33ca0 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
33cb0 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
33cc0 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
33cd0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
33ce0 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
33cf0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
33d00 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
33d10 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
33d20 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
33d30 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
33d40 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
33d50 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
33d60 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
33d70 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
33d80 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
33d90 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
33da0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
33db0 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
33dc0 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
33dd0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
33de0 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
33df0 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
33e00 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
33e10 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
33e20 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
33e30 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
33e40 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
33e50 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
33e60 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
33e70 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
33e80 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
33e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33ea0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
33eb0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
33ec0 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
33ed0 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
33ee0 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
33ef0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
33f00 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
33f10 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
33f20 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
33f30 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
33f40 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
33f50 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
33f60 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
33f70 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
33f80 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
33f90 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
33fa0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
33fb0 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
33fc0 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
33fd0 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
33fe0 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
33ff0 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
34000 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
34010 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
34020 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
34030 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
34040 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
34050 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
34060 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
34070 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
34080 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
34090 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
340a0 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
340b0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
340c0 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
340d0 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
340e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
340f0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
34100 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34110 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
34120 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
34130 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
34140 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
34150 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
34160 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
34170 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
34180 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
34190 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
341a0 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
341b0 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
341c0 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
341d0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
341e0 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
341f0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
34200 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
34210 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
34220 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
34230 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
34240 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
34250 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
34260 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
34270 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
34280 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
34290 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
342a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
342b0 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
342c0 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
342d0 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
342e0 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
342f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
34300 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
34310 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
34320 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
34330 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
34340 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
34350 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
34360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34370 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
34380 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
34390 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
343a0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
343b0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
343c0 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
343d0 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
343e0 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
343f0 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
34400 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
34410 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
34420 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
34430 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
34440 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
34450 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
34460 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
34470 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
34480 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
34490 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
344a0 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
344b0 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
344c0 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
344d0 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
344e0 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
344f0 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
34500 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
34510 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
34520 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
34530 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
34540 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
34550 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
34560 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
34570 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
34580 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
34590 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
345a0 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
345b0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
345c0 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
345d0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
345e0 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
345f0 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
34600 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
34610 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
34620 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
34630 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
34640 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
34650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34660 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
34670 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
34680 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
34690 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
346a0 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
346b0 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
346c0 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
346d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
346e0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
346f0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
34700 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
34710 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
34720 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
34730 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
34740 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
34750 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
34760 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
34770 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
34780 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
34790 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
347a0 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
347b0 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
347c0 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
347d0 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
347e0 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
347f0 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
34800 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
34810 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
34820 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
34830 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
34840 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
34850 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
34860 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
34870 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
34880 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
34890 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
348a0 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
348b0 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
348c0 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
348d0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
348e0 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
348f0 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
34900 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
34910 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
34920 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
34930 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
34940 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
34950 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
34960 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
34970 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
34980 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
34990 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
349a0 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
349b0 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
349c0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
349d0 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
349e0 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
349f0 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
34a00 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
34a10 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
34a20 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
34a30 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
34a40 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
34a50 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
34a60 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
34a70 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
34a80 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
34a90 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
34aa0 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
34ab0 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
34ac0 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
34ad0 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
34ae0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
34af0 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
34b00 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
34b10 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
34b20 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
34b30 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
34b40 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
34b50 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
34b60 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
34b70 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
34b80 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
34b90 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
34ba0 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
34bb0 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
34bc0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
34bd0 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
34be0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
34bf0 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
34c00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
34c10 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
34c20 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
34c30 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
34c40 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
34c50 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
34c60 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
34c70 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
34c80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
34c90 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
34ca0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
34cb0 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
34cc0 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
34cd0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
34ce0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
34cf0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
34d00 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
34d10 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
34d20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
34d30 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
34d40 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
34d50 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
34d60 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
34d70 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
34d80 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
34d90 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
34da0 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
34db0 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
34dc0 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
34dd0 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
34de0 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
34df0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
34e00 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
34e10 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
34e20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
34e30 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
34e40 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
34e50 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
34e60 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
34e70 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
34e80 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
34e90 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
34ea0 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
34eb0 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
34ec0 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
34ed0 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
34ee0 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
34ef0 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
34f00 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
34f10 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
34f20 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
34f30 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
34f40 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
34f50 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
34f60 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
34f70 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
34f80 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
34f90 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
34fa0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
34fb0 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
34fc0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
34fd0 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
34fe0 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
34ff0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
35000 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
35010 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
35020 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
35030 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
35040 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
35050 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
35060 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
35070 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
35080 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
35090 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
350a0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
350b0 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
350c0 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
350d0 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
350e0 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
350f0 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
35100 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
35110 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
35120 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
35130 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
35140 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
35150 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
35160 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
35170 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
35180 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
35190 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
351a0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
351b0 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
351c0 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
351d0 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
351e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
351f0 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
35200 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
35210 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
35220 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
35230 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
35240 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
35250 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
35260 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
35270 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
35280 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
35290 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
352a0 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
352b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
352c0 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
352d0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
352e0 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
352f0 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
35300 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
35310 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
35320 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
35330 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
35340 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
35350 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
35360 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
35370 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
35380 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
35390 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
353a0 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
353b0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
353c0 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
353d0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
353e0 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
353f0 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
35400 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
35410 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
35420 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
35430 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
35440 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
35450 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
35460 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
35470 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
35480 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
35490 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
354a0 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
354b0 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
354c0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
354d0 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
354e0 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
354f0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
35500 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
35510 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
35520 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
35530 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  ';.        if( o
35540 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49  sMkdir(buf, SQLI
35550 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
35560 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
35570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
35580 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
35590 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
355a0 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
355b0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
355c0 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
355d0 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
355e0 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
355f0 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
35600 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
35610 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
35620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35630 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
35640 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
35650 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
35660 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
35670 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
35680 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35690 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
356a0 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
356b0 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
356c0 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
356d0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
356e0 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
356f0 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
35700 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  n", lockPath, ge
35710 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
35720 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
35730 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
35740 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35750 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
35760 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
35770 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
35780 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
35790 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
357a0 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
357b0 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
357c0 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
357d0 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
357e0 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
357f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
35800 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
35810 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
35820 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
35830 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
35840 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
35850 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
35860 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
35870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
35880 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
35890 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
358a0 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
358b0 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
358c0 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
358d0 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
358e0 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
358f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
35900 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
35910 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
35920 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
35930 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
35940 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
35950 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
35960 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
35970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
35980 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
35990 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
359a0 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
359b0 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
359c0 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
359d0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
359e0 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
359f0 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
35a00 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
35a10 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
35a20 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
35a30 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
35a40 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
35a50 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
35a60 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
35a70 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
35a80 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
35a90 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
35aa0 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
35ab0 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
35ac0 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
35ad0 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
35ae0 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
35af0 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
35b00 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
35b10 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
35b20 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
35b30 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
35b40 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
35b50 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
35b60 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
35b70 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
35b80 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
35b90 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
35ba0 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
35bb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
35bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
35bd0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
35be0 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62   ){.    fd = rob
35bf0 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
35c00 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
35c10 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
35c20 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
35c30 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  & errno==ENOENT 
35c40 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b  && islockfile ){
35c50 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79  .      if( proxy
35c60 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70  CreateLockPath(p
35c70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f  ath) == SQLITE_O
35c80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20  K ){.        fd 
35c90 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
35ca0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
35cb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35cc0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
35cd0 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
35ce0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
35cf0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
35d00 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
35d10 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e  s, 0);.    terrn
35d20 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
35d30 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
35d40 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
35d50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
35d60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
35d70 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
35d80 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
35d90 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
35da0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35db0 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
35dc0 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
35dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
35de0 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
35df0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
35e00 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
35e10 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
35e20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35e30 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
35e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
35e50 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
35e60 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
35e70 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
35e80 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
35e90 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
35ea0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
35eb0 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
35ec0 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
35ed0 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
35ee0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
35ef0 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
35f00 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
35f10 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56    memset(&dummyV
35f20 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  fs, 0, sizeof(du
35f30 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d  mmyVfs));.  dumm
35f40 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
35f50 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
35f60 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d  IoFinder;.  dumm
35f70 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75  yVfs.zName = "du
35f80 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d  mmy";.  pUnused-
35f90 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75  >fd = fd;.  pUnu
35fa0 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65  sed->flags = ope
35fb0 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  nFlags;.  pNew->
35fc0 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
35fd0 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  d;.  .  rc = fil
35fe0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
35ff0 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69  myVfs, fd, (sqli
36000 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
36010 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20  path, 0);.  if( 
36020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36030 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
36040 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
36050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
36060 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
36070 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c      .  robust_cl
36080 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f  ose(pNew, fd, __
36090 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74  LINE__);.  sqlit
360a0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
360b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
360c0 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  nused);.  return
360d0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
360e0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69  QLITE_TEST./* si
360f0 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
36100 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
36110 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
36120 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e  file paths */.in
36130 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
36140 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  _num = 0;.#endif
36150 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ..#define PROXY_
36160 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20  HOSTIDLEN    16 
36170 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
36180 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f  ost id length */
36190 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20  ../* Not always 
361a0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68  defined in the h
361b0 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67  eaders as it oug
361c0 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65  ht to be */.exte
361d0 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75  rn int gethostuu
361e0 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f  id(uuid_t id, co
361f0 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
36200 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20  pec *wait);../* 
36210 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
36220 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
36230 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
36240 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
36250 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
36260 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
36270 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
36280 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
36290 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
362a0 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
362b0 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65  *pError){.  asse
362c0 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
362d0 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
362e0 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
362f0 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
36300 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
36310 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f  f defined(__MAX_
36320 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
36330 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20  _REQUIRED)\.    
36340 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f             && __
36350 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
36360 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30  _MIN_REQUIRED<10
36370 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  50.  {.    stati
36380 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  c const struct t
36390 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
363a0 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
363b0 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
363c0 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
363d0 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
363e0 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
363f0 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
36400 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
36410 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
36420 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
36430 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
36440 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
36450 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
36460 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36470 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
36480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
36490 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
364a0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
364b0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
364c0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
364d0 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
364e0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
364f0 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
36500 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
36510 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
36520 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
36530 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
36540 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
36550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36560 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
36570 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
36580 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
36590 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
365a0 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
365b0 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
365c0 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
365d0 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
365e0 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
365f0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
36600 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
36610 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
36620 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
36630 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
36640 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
36650 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
36660 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36670 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
36680 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
36690 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
366a0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
366b0 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
366c0 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
366d0 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
366e0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
366f0 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
36700 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
36710 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
36720 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
36730 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
36740 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
36750 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
36760 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
36770 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
36780 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
36790 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
367a0 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
367b0 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
367c0 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
367d0 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
367e0 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
367f0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
36800 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
36810 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36820 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36830 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36840 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36850 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
36860 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36870 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36880 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
36890 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
368a0 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
368b0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
368c0 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
368d0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
368e0 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
368f0 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
36900 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
36910 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
36920 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
36930 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
36940 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
36950 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
36960 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
36970 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
36980 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
36990 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
369a0 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
369b0 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
369c0 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
369d0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
369e0 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
369f0 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
36a00 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
36a10 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
36a20 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
36a30 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
36a40 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
36a50 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
36a60 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
36a70 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
36a80 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
36a90 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
36aa0 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
36ab0 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
36ac0 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
36ad0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
36ae0 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
36af0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
36b00 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
36b10 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
36b20 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
36b30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
36b40 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
36b50 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
36b60 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
36b70 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
36b80 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
36b90 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
36ba0 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
36bb0 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
36bc0 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
36bd0 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
36be0 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
36bf0 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 66  CL), 0);.  if( f
36c00 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
36c10 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36c20 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
36c30 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
36c40 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
36c50 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
36c60 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
36c70 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c  if( osPwrite(fd,
36c80 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
36c90 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
36ca0 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
36cb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
36cc0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
36cd0 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
36ce0 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
36cf0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
36d00 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
36d10 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
36d20 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
36d30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36d40 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
36d50 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
36d60 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
36d70 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
36d80 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
36d90 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
36da0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
36db0 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
36dc0 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
36dd0 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f  h);.  robust_clo
36de0 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46  se(pFile, conchF
36df0 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
36e00 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
36e10 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
36e20 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
36e30 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
36e40 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
36e50 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
36e60 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
36e70 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74        osUnlink(t
36e80 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62  Path);.      rob
36e90 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
36ea0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
36eb0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
36ec0 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
36ed0 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65  d to break stale
36ee0 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c   lock on %s, %s\
36ef0 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73  n", cPath, errms
36f00 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
36f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20   rc;.}../* Take 
36f20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
36f30 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
36f40 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61  file and break a
36f50 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74   stale lock if t
36f60 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d  he .** host id m
36f70 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  atches..*/.stati
36f80 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68  c int proxyConch
36f90 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
36fa0 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
36fb0 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54  ostID, int lockT
36fc0 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ype){.  proxyLoc
36fd0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
36fe0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
36ff0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
37000 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37010 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
37020 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
37030 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e  >conchFile;.  in
37040 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37050 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d  ;.  int nTries =
37060 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d   0;.  struct tim
37070 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69  espec conchModTi
37080 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  me;.  .  memset(
37090 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30  &conchModTime, 0
370a0 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f  , sizeof(conchMo
370b0 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a  dTime));.  do {.
370c0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
370d0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
370e0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
370f0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
37100 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69  kType);.    nTri
37110 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72  es ++;.    if( r
37120 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
37130 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
37140 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
37150 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
37160 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
37170 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
37180 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
37190 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
371a0 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
371b0 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
371c0 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
371d0 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
371e0 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
371f0 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
37200 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
37210 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
37220 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
37230 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
37240 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
37250 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
37260 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
37270 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
37280 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63  if( osFstat(conc
37290 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
372a0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
372b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
372c0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
372d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
372e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
372f0 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
37300 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20  nTries==1 ){.   
37310 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
37320 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65  e = buf.st_mtime
37330 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73  spec;.        us
37340 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a  leep(500000); /*
37350 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e   wait 0.5 sec an
37360 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
37370 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63  gain*/.        c
37380 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
37390 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
373a0 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20  ( nTries>1 );.  
373b0 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64      if( conchMod
373c0 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62  Time.tv_sec != b
373d0 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
373e0 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20  tv_sec || .     
373f0 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
37400 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e  .tv_nsec != buf.
37410 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
37420 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nsec ){.        
37430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
37440 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SY;.      }.    
37450 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37460 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20  ies==2 ){  .    
37470 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52      char tBuf[PR
37480 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
37490 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  ;.        int le
374a0 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
374b0 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20  hFile->h, tBuf, 
374c0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
374d0 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  N, 0);.        i
374e0 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  f( len<0 ){.    
374f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
37500 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
37510 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
37520 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37530 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  CK;.        }.  
37540 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52        if( len>PR
37550 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26  OXY_PATHINDEX &&
37560 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29   tBuf[0]==(char)
37570 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
37580 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ON){.          /
37590 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
375a0 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f  e lock if the ho
375b0 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61  st id doesn't ma
375c0 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
375d0 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26   if( 0!=memcmp(&
375e0 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  tBuf[PROXY_HEADE
375f0 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
37600 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
37610 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
37620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37630 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
37640 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
37650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
37660 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
37670 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20  k on short read 
37680 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73  or a version mis
37690 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
376a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
376b0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
376c0 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
376d0 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  10000000); /* wa
376e0 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72  it 10 sec and tr
376f0 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
37700 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
37710 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20  inue; .      }. 
37720 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65       .      asse
37730 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b  rt( nTries==3 );
37740 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72  .      if( 0==pr
37750 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
37760 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
37770 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  D) ){.        rc
37780 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37790 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79        if( lockTy
377a0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
377b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
377c0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
377d0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
377e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
377f0 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
37800 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20  LOCK);          
37810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37820 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
37830 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
37840 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37850 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37860 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37870 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37890 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72    }.  } while( r
378a0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
378b0 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20  & nTries<3 );.  
378c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
378d0 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f  ./* Takes the co
378e0 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20  nch by taking a 
378f0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
37900 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
37910 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20  s conch, if .** 
37920 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d  lockPath is non-
37930 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49  NULL, the host I
37940 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  D and lock file 
37950 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e  path must match.
37960 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63    A NULL .** loc
37970 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74  kPath means that
37980 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e   the lockPath in
37990 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
379a0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20  will be used if 
379b0 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73  the .** host IDs
379c0 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77   match, or a new
379d0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
379e0 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74  be generated aut
379f0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61  omatically .** a
37a00 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  nd written to th
37a10 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f  e conch file..*/
37a20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37a30 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46  yTakeConch(unixF
37a40 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70  ile *pFile){.  p
37a50 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37a60 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
37a70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37a80 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
37a90 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69  Context; .  .  i
37aa0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
37ab0 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ld!=0 ){.    ret
37ac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
37ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
37ae0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
37af0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
37b00 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79  e;.    uuid_t my
37b10 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20  HostID;.    int 
37b20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
37b30 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f  char readBuf[PRO
37b40 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37b50 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61  .    char lockPa
37b60 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
37b70 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f      char *tempLo
37b80 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ckPath = NULL;. 
37b90 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
37ba0 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63  TE_OK;.    int c
37bb0 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a  reateConch = 0;.
37bc0 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61      int hostIdMa
37bd0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tch = 0;.    int
37be0 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
37bf0 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b    int tryOldLock
37c00 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Path = 0;.    in
37c10 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61  t forceNewLockPa
37c20 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20  th = 0;.    .   
37c30 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
37c40 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
37c50 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
37c60 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
37c70 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63        (pCtx->loc
37c80 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74  kProxyPath ? pCt
37c90 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
37ca0 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
37cb0 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72  tpid()));..    r
37cc0 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74  c = proxyGetHost
37cd0 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45  ID(myHostID, &pE
37ce0 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rror);.    if( (
37cf0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
37d00 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
37d10 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
37d20 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
37d30 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
37d40 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nch;.    }.    r
37d50 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
37d60 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
37d70 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ID, SHARED_LOCK)
37d80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
37d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37da0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
37db0 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nch;.    }.    /
37dc0 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74  * read the exist
37dd0 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  ing conch file *
37de0 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20  /.    readLen = 
37df0 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69  seekAndRead((uni
37e00 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  xFile*)conchFile
37e10 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52  , 0, readBuf, PR
37e20 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29  OXY_MAXCONCHLEN)
37e30 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65  ;.    if( readLe
37e40 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
37e50 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45  I/O error: lastE
37e60 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
37e70 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20  AndRead */.     
37e80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
37e90 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c  o = conchFile->l
37ea0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
37eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
37ec0 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f  R_READ;.      go
37ed0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
37ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37ef0 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f  readLen<=(PROXY_
37f00 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
37f10 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20  HOSTIDLEN) || . 
37f20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
37f30 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52  Buf[0]!=(char)PR
37f40 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
37f50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73   ){.      /* a s
37f60 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72  hort read or ver
37f70 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d  sion format mism
37f80 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65  atch means we ne
37f90 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
37fa0 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ew .      ** con
37fb0 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  ch file. .      
37fc0 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43  */.      createC
37fd0 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  onch = 1;.    }.
37fe0 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f      /* if the ho
37ff0 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e  st id matches an
38000 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  d the lock path 
38010 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
38020 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20  n the conch.    
38030 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20  ** we'll try to 
38040 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65  use the path the
38050 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20  re, if we can't 
38060 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20  open that path, 
38070 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65  we'll .    ** re
38080 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61  try with a new a
38090 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61  uto-generated pa
380a0 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  th .    */.    d
380b0 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77  o { /* in case w
380c0 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67  e need to try ag
380d0 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f  ain for an :auto
380e0 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c  : named lock fil
380f0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
38100 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20  !createConch && 
38110 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74  !forceNewLockPat
38120 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73  h ){.        hos
38130 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63  tIdMatch = !memc
38140 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58  mp(&readBuf[PROX
38150 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
38160 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20  HostID, .       
38170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38180 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59             PROXY
38190 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20  _HOSTIDLEN);.   
381a0 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63       /* if the c
381b0 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f  onch has data co
381c0 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
381d0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ts */.        if
381e0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
381f0 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
38200 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d      /* for auto-
38210 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b  named local lock
38220 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63   file, just chec
38230 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  k the host ID an
38240 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20  d we'll.        
38250 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f     ** use the lo
38260 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
38270 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64  th that's alread
38280 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20  y in there.     
38290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
382a0 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
382b0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
382c0 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
382d0 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52   = (readLen - PR
382e0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a  OXY_PATHINDEX);.
382f0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
38300 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74           if( pat
38310 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e  hLen>=MAXPATHLEN
38320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
38330 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54    pathLen=MAXPAT
38340 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20  HLEN-1;.        
38350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
38360 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74    memcpy(lockPat
38370 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
38380 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61  Y_PATHINDEX], pa
38390 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  thLen);.        
383a0 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74      lockPath[pat
383b0 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  hLen] = 0;.     
383c0 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50         tempLockP
383d0 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a  ath = lockPath;.
383e0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4f              tryO
383f0 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a  ldLockPath = 1;.
38400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
38410 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
38420 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66  the lock path if
38430 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61   the conch is ta
38440 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
38450 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
38460 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20  conch;.         
38470 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
38480 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
38490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
384a0 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78  && !strncmp(pCtx
384b0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
384c0 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
384d0 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20  PATHINDEX],.    
384e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
384f0 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50         readLen-P
38500 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a  ROXY_PATHINDEX).
38510 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
38520 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f       /* conch ho
38530 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68  st and lock path
38540 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
38550 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
38560 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20  econch; .       
38570 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
38580 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68   .      /* if th
38590 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72  e conch isn't wr
385a0 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e  itable and doesn
385b0 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e  't match, we can
385c0 27 74 20 74 61 6b 65 20 6