/ Hex Artifact Content
Login

Artifact 243fb37f47dc072fc59839ea241ff0a17c8d76e6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e  no.h>.#if !defin
1140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
1150: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
1160: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 69  X_MMAP_SIZE>0.#i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1180: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  .h>.#endif...#if
1190: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11a0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
11b0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11c0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11d0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11e0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11f0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
1200: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
1210: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1220: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1230: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1240: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1250: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1260: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1270: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1280: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1290: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12a0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
12b0: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12c0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12d0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12e0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12f0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
1300: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
1310: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1320: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1330: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1340: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1350: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1360: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1370: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1380: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1390: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
13a0: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
13b0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13c0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13d0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13e0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13f0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
1400: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1410: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1420: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1430: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1440: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1450: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1460: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1470: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1480: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1490: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
14a0: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
14b0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d  .** Default perm
14c0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14d0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14e0: 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   dir.*/.#ifndef 
14f0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1500: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1510: 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ONS.# define SQL
1520: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
1530: 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
1540: 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0755.#endif../*
1550: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70  .** Maximum supp
1560: 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74  orted path-lengt
1570: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  h..*/.#define MA
1580: 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a  X_PATHNAME 512..
1590: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
15a0: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
15b0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
15c0: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
15d0: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
15e0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
15f0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
1600: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
1610: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
1620: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
1630: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1640: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1650: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1660: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1670: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1690: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
16a0: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
16b0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
16c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
16d0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
16e0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
16f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1700: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
1710: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1720: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
1730: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1740: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1750: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1760: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1770: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1780: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1790: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
17a0: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
17b0: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
17c0: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
17d0: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
17e0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
17f0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
1800: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
1810: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
1820: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
1830: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1840: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1850: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1860: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1870: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1880: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1890: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
18a0: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
18b0: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
18c0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
18f0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
1900: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
1910: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1920: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
1930: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1940: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1950: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1960: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1970: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1980: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1990: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
19a0: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
19b0: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
19c0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
19d0: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
19e0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
19f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
1a00: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1a10: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
1a20: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
1a30: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1a40: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1a50: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1a60: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1a70: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1a80: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa0: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1ab0: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1ac0: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1ad0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
1b00: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
1b10: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1b40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1b50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1b60: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1b80: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1b90: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1ba0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1bb0: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1bc0: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1bd0: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
1be0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
1bf0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
1c20: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
1c30: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1c40: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1c50: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c60: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1c70: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1c80: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1c90: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1cb0: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1cc0: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d00: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1d10: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1d40: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1d50: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1d60: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d80: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1d90: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1da0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1db0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1dc0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1e00: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1e10: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1e20: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1e30: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1e40: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1e50: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1e60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1e70: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1e80: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1e90: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1ea0: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1eb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1ec0: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1ed0: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ee0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1ef0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1f00: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1f30: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1f40: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1f50: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1f60: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1f80: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1f90: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1fa0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1fc0: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1fd0: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1fe0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1ff0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2000: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
2010: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
2040: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
2050: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
2060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2070: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
2080: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2090: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
20a0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
20b0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
20c0: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
20d0: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
20e0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
20f0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
2100: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
2110: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
2120: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
2130: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2140: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2150: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2160: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2170: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2180: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2190: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
21a0: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
21b0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
21c0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
21d0: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
21e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
21f0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
2200: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2210: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2220: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
2230: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2240: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2250: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2260: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2270: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2280: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2290: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
22a0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
22b0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
22c0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
22d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
22e0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
22f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2310: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2320: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2330: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2340: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2350: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2360: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2370: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2380: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2390: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
23a0: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
23b0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
23c0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
23d0: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
23e0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
23f0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
2400: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2410: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2420: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
2430: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2440: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2450: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2460: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2470: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2480: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2490: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
24a0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
24b0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
24c0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
24d0: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
24e0: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
24f0: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2500: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2510: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2520: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2530: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2540: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2550: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2560: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
2570: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
2580: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
2590: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25a0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
25b0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
25c0: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
25d0: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
25e0: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
25f0: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2600: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2610: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2620: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2630: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2640: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2650: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
2660: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
2670: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
2680: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
2690: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
26a0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
26b0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
26c0: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
26d0: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
26e0: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
26f0: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2700: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2710: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2720: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2730: 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  ocking */.#defin
2740: 65 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  e UNIXFILE_WARNE
2750: 44 20 20 20 20 30 78 30 31 30 30 20 20 20 20 20  D    0x0100     
2760: 2f 2a 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  /* verifyDbFile(
2770: 29 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65 20  ) warnings have 
2780: 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a  been issued */..
2790: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
27a0: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
27b0: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
27c0: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
27d0: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
27e0: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
27f0: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
2800: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
2810: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
2820: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
2830: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
2840: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
2850: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2860: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
2870: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
2880: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
2890: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
28a0: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
28b0: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
28c0: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
28d0: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
28e0: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
28f0: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
2900: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
2910: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2920: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2930: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
2940: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
2950: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
2960: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
2970: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
2980: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
2990: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
29a0: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
29b0: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
29c0: 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  .** HAVE_MREMAP 
29d0: 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65  defaults to true
29e0: 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61   on Linux and fa
29f0: 6c 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65  lse everywhere e
2a00: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  lse..*/.#if !def
2a10: 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50  ined(HAVE_MREMAP
2a20: 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f  ).# if defined(_
2a30: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
2a40: 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45  ined(_GNU_SOURCE
2a50: 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45  ).#  define HAVE
2a60: 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65  _MREMAP 1.# else
2a70: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
2a80: 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66  MREMAP 0.# endif
2a90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
2aa0: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2ab0: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2ac0: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2ad0: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ae0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2af0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2b00: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2b10: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2b20: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2b30: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2b40: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2b50: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2b60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2b70: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2b80: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2b90: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2ba0: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2bb0: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2bc0: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2bd0: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2be0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2bf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2c00: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2c10: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2c20: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2c30: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2c40: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2c50: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  e);.}../*.** On 
2c60: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
2c70: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
2c80: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
2c90: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
2ca0: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
2cb0: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
2cc0: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
2cd0: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
2ce0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
2cf0: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
2d00: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
2d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2d20: 69 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  ixFchown(int fd,
2d30: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
2d40: 74 20 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  t gid){.  return
2d50: 20 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a   geteuid() ? 0 :
2d60: 20 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67   fchown(fd,uid,g
2d70: 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  id);.}../* Forwa
2d80: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2d90: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2da0: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2db0: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a  har*, int*);../*
2dc0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
2dd0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
2de0: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
2df0: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
2e00: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
2e10: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
2e20: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2e30: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
2e40: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
2e50: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
2e60: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
2e70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
2e80: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
2e90: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2ea0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2eb0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2ec0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
2ed0: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
2ee0: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
2ef0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
2f00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2f10: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2f20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2f30: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
2f40: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
2f50: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
2f60: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
2f70: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
2f80: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
2f90: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
2fa0: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20  Syscall[] = {.  
2fb0: 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20  { "open",       
2fc0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2fd0: 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e  ll_ptr)posixOpen
2fe0: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
2ff0: 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69   osOpen      ((i
3000: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3010: 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63  *,int,int))aSysc
3020: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
3030: 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20  ..  { "close",  
3040: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3050: 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65  yscall_ptr)close
3060: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3070: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20  fine osClose    
3080: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61   ((int(*)(int))a
3090: 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72  Syscall[1].pCurr
30a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73  ent)..  { "acces
30b0: 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  s",       (sqlit
30c0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61  e3_syscall_ptr)a
30d0: 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c  ccess,     0  },
30e0: 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73  .#define osAcces
30f0: 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f  s    ((int(*)(co
3100: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61  nst char*,int))a
3110: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
3120: 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77  ent)..  { "getcw
3130: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3140: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67  e3_syscall_ptr)g
3150: 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c  etcwd,     0  },
3160: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77  .#define osGetcw
3170: 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28  d    ((char*(*)(
3180: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
3190: 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65  yscall[3].pCurre
31a0: 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c  nt)..  { "stat",
31b0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
31c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74  3_syscall_ptr)st
31d0: 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  at,       0  },.
31e0: 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20  #define osStat  
31f0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3200: 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20  st char*,struct 
3210: 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  stat*))aSyscall[
3220: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a  4].pCurrent)../*
3230: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
3240: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
3250: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
3260: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
3270: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
3280: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
3290: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
32a0: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
32b0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
32c0: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
32d0: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
32e0: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
32f0: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
3300: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
3310: 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20  t is DOS - what 
3320: 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a  did you expect?.
3330: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50  */.#ifdef __DJGP
3340: 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c  P__.  { "fstat",
3350: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
3360: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c             0  },
3370: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
3380: 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c  (a,b,c)    0.#el
3390: 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74  se     .  { "fst
33a0: 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  at",        (sql
33b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33c0: 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20  )fstat,      0  
33d0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
33e0: 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  at     ((int(*)(
33f0: 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a  int,struct stat*
3400: 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43  ))aSyscall[5].pC
3410: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
3420: 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c    { "ftruncate",
3430: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3440: 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61  call_ptr)ftrunca
3450: 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  te,  0  },.#defi
3460: 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28  ne osFtruncate (
3470: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f  (int(*)(int,off_
3480: 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  t))aSyscall[6].p
3490: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
34a0: 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73  cntl",        (s
34b0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34c0: 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30  tr)fcntl,      0
34d0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
34e0: 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a  cntl     ((int(*
34f0: 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61  )(int,int,...))a
3500: 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72  Syscall[7].pCurr
3510: 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22  ent)..  { "read"
3520: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3530: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72  e3_syscall_ptr)r
3540: 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  ead,       0  },
3550: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20  .#define osRead 
3560: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3570: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
3580: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  _t))aSyscall[8].
3590: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
35a0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
35b0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
35c0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
35d0: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
35e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35f0: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c  scall_ptr)pread,
3600: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73        0  },.#els
3610: 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  e.  { "pread",  
3620: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3630: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3640: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3650: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
3660: 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ead     ((ssize_
3670: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
3680: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
3690: 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e  scall[9].pCurren
36a0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
36b0: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
36c0: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
36d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
36e0: 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20  l_ptr)pread64,  
36f0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3700: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3710: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3720: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3730: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3740: 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36  #define osPread6
3750: 34 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  4   ((ssize_t(*)
3760: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
3770: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3780: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
3790: 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20  .  { "write",   
37a0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
37b0: 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c  scall_ptr)write,
37c0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
37d0: 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20  ine osWrite     
37e0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
37f0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3800: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  e_t))aSyscall[11
3810: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3820: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3830: 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  AD) || SQLITE_EN
3840: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
3850: 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  LE.  { "pwrite",
3860: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3870: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69  syscall_ptr)pwri
3880: 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  te,     0  },.#e
3890: 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22  lse.  { "pwrite"
38a0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
38b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
38c0: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
38d0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
38e0: 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a  Pwrite    ((ssiz
38f0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
3900: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66   void*,size_t,of
3910: 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20  f_t))\.         
3920: 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63             aSysc
3930: 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74  all[12].pCurrent
3940: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3950: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
3960: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
3970: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3980: 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20  _ptr)pwrite64,  
3990: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
39a0: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
39b0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
39c0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
39d0: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
39e0: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36  define osPwrite6
39f0: 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  4  ((ssize_t(*)(
3a00: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3a10: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d      aSyscall[13]
3a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3a50: 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20  "fchmod",       
3a60: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3a70: 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20  _ptr)fchmod,    
3a80: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3a90: 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74  sFchmod    ((int
3aa0: 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29  (*)(int,mode_t))
3ab0: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
3ac0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3ad0: 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
3ae0: 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
3af0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3b00: 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  E.  { "fallocate
3b10: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3b20: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
3b30: 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d  _fallocate,  0 }
3b40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c  ,.#else.  { "fal
3b50: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
3b60: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b70: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3b80: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3b90: 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61  define osFalloca
3ba0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
3bb0: 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  off_t,off_t))aSy
3bc0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
3bd0: 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b  nt)..  { "unlink
3be0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3bf0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
3c00: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20  link,           
3c10: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55  0 },.#define osU
3c20: 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a  nlink    ((int(*
3c30: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
3c40: 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72  Syscall[16].pCur
3c50: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e  rent)..  { "open
3c60: 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28  Directory",    (
3c70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c80: 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72  ptr)openDirector
3c90: 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  y,      0 },.#de
3ca0: 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63  fine osOpenDirec
3cb0: 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f  tory ((int(*)(co
3cc0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29  nst char*,int*))
3cd0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3ce0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64  rrent)..  { "mkd
3cf0: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3d00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3d10: 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20  )mkdir,         
3d20: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3d30: 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74  sMkdir     ((int
3d40: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
3d50: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3d60: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
3d70: 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20    { "rmdir",    
3d80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3d90: 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20  call_ptr)rmdir, 
3da0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3db0: 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20  define osRmdir  
3dc0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3dd0: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3de0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
3df0: 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20  .  { "fchown",  
3e00: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e10: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 46  scall_ptr)posixF
3e20: 63 68 6f 77 6e 2c 20 20 20 20 20 30 20 7d 2c 0a  chown,     0 },.
3e30: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e  #define osFchown
3e40: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3e50: 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53  ,uid_t,gid_t))aS
3e60: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
3e70: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
3e80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
3e90: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
3ea0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
3eb0: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
3ec0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3ed0: 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30  _ptr)mmap,     0
3ee0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d   },.#define osMm
3ef0: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
3f00: 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69  id*,size_t,int,i
3f10: 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  nt,int,off_t))aS
3f20: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3f30: 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61  ent)..  { "munma
3f40: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3f50: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3f60: 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  unmap,          
3f70: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d  0 },.#define osM
3f80: 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  unmap ((void*(*)
3f90: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
3fa0: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
3fb0: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
3fc0: 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d  MREMAP.  { "mrem
3fd0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
3fe0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3ff0: 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mremap,         
4000: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4010: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4020: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4030: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
4040: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4050: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d  f.#define osMrem
4060: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
4070: 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f  id*,size_t,size_
4080: 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63  t,int,...))aSysc
4090: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
40a0: 29 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20  ).#endif..}; /* 
40b0: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
40c0: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
40d0: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
40e0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
40f0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
4100: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
4110: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
4120: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
4130: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4140: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
4150: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
4160: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
4170: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
4180: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
4190: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
41a0: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
41b0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
41c0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
41d0: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
41e0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
41f0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
4200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
4210: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
4220: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
4230: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
4240: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4250: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
4260: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
4270: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4280: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
4290: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
42a0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
42b0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
42c0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
42d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
42e0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
42f0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
4300: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
4310: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4320: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
4330: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
4340: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
4350: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
4360: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
4370: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
4380: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
4390: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
43a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
43b0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
43c0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
43d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
43e0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
43f0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
4400: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4410: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
4420: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
4430: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4440: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4450: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4460: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4470: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4480: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4490: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
44a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
44b0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
44c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
44d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
44e0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
44f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4500: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
4510: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4520: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
4530: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4540: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4550: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4560: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4570: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4580: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4590: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
45a0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
45b0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
45c0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
45d0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
45e0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
45f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4600: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4620: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
4630: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4640: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4650: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4660: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4670: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4680: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4690: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
46a0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
46b0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
46c0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
46d0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
46e0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
46f0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4700: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4710: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
4720: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
4730: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4740: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4750: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4760: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4770: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4780: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4790: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
47a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
47b0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
47c0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
47d0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
47e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
47f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4800: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4810: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
4820: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
4830: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4840: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4850: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4860: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4870: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4880: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4890: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
48a0: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
48b0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
48c0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
48d0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
48e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
48f0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
4900: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
4910: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4920: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4930: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4940: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4950: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4960: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4970: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4990: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
49a0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
49b0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
49c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
49d0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
49e0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
49f0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
4a00: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
4a10: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4a20: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
4a30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4a40: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63  /*.** Do not acc
4a50: 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73  ept any file des
4a60: 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61  criptor less tha
4a70: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e  n this value, in
4a80: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a   order to avoid.
4a90: 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62  ** opening datab
4aa0: 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66  ase file using f
4ab0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4ac0: 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c  that are commonl
4ad0: 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73  y used for .** s
4ae0: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
4af0: 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72  utput, and error
4b00: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
4b10: 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45  ITE_MINIMUM_FILE
4b20: 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65  _DESCRIPTOR.# de
4b30: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49  fine SQLITE_MINI
4b40: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
4b50: 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TOR 3.#endif../*
4b60: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28  .** Invoke open(
4b70: 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70  ).  Do so multip
4b80: 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20  le times, until 
4b90: 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65  it either succee
4ba0: 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66  ds or.** fails f
4bb0: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f  or some reason o
4bc0: 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e  ther than EINTR.
4bd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
4be0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
4bf0: 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73   "m" is 0 then s
4c00: 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  et it to the def
4c10: 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69  ault for.** SQLi
4c20: 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  te.  The default
4c30: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55   is SQLITE_DEFAU
4c40: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
4c50: 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ONS (normally.**
4c60: 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69   0644) as modifi
4c70: 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ed by the system
4c80: 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73   umask.  If m is
4c90: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20   not 0, then.** 
4ca0: 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72  make the file cr
4cb0: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65  eation mode be e
4cc0: 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e  xactly m ignorin
4cd0: 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a  g the umask..**.
4ce0: 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74  ** The m paramet
4cf0: 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a  er will be non-z
4d00: 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72  ero only when cr
4d10: 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f  eating -wal, -jo
4d20: 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73  urnal,.** and -s
4d30: 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61  hm files.  We wa
4d40: 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74  nt those files t
4d50: 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a  o have *exactly*
4d60: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72   the same.** per
4d70: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69  missions as thei
4d80: 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  r original datab
4d90: 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74  ase, unadulterat
4da0: 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
4db0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c  .** In that way,
4dc0: 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
4dd0: 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77  ile is -rw-rw-rw
4de0: 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61   or -rw-rw-r-, a
4df0: 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74  nd a.** transact
4e00: 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20  ion crashes and 
4e10: 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f  leaves behind ho
4e20: 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
4e30: 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20   any.** process 
4e40: 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20  that is able to 
4e50: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
4e60: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20  abase will also 
4e70: 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65  be able to.** re
4e80: 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f  cover the hot jo
4e90: 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  urnals..*/.stati
4ea0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
4eb0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
4ec0: 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d   int f, mode_t m
4ed0: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d  ){.  int fd;.  m
4ee0: 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d  ode_t m2 = m ? m
4ef0: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
4f00: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
4f10: 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  NS;.  while(1){.
4f20: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
4f30: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
4f40: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
4f50: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
4f60: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
4f70: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
4f80: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
4f90: 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
4fa0: 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75  =EINTR ) continu
4fb0: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
4fc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
4fd0: 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  >=SQLITE_MINIMUM
4fe0: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
4ff0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73   ) break;.    os
5000: 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73  Close(fd);.    s
5010: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5020: 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20  E_WARNING, .    
5030: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74              "att
5040: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25  empt to open \"%
5050: 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63  s\" as file desc
5060: 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66  riptor %d", z, f
5070: 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b  d);.    fd = -1;
5080: 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28  .    if( osOpen(
5090: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20  "/dev/null", f, 
50a0: 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m)<0 ) break;.  
50b0: 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  }.  if( fd>=0 ){
50c0: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
50d0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
50e0: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
50f0: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
5100: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
5110: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
5120: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
5130: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
5140: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
5150: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
5160: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
5170: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
5180: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
5190: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
51a0: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
51b0: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
51c0: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
51d0: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
51e0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
51f0: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
5200: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
5210: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
5220: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
5230: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
5240: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
5250: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
5260: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
5270: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
5280: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
5290: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
52a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
52b0: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
52c0: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
52d0: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
52e0: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
52f0: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
5300: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
5310: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
5320: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
5330: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
5340: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
5350: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
5360: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5370: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
5380: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
5390: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
53a0: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
53b0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
53c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
53d0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
53e0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
53f0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
5400: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5410: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
5420: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5430: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
5440: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
5450: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
5460: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
5470: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
5480: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
5490: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
54a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
54b0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
54c0: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
54d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
54e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
54f0: 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
5500: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5510: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
5520: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5530: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5540: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
5550: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66  #endif...#if def
5560: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
5570: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5580: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
5590: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
55a0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
55b0: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
55c0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
55d0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
55e0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
55f0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
5600: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
5610: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
5620: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
5630: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5640: 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74   *azFileLock(int
5650: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73   eFileLock){.  s
5660: 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b  witch( eFileLock
5670: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f   ){.    case NO_
5680: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
5690: 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48  NE";.    case SH
56a0: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
56b0: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20  n "SHARED";.    
56c0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
56d0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
56e0: 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  RVED";.    case 
56f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
5700: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
5710: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
5720: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
5730: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
5740: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
5750: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ";.}.#endif..#if
5760: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
5770: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
5780: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
5790: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
57a0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
57b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
57c0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
57d0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
57e0: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
57f0: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
5800: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
5810: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
5820: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
5830: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
5840: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
5850: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
5860: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
5870: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
5880: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
5890: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
58a0: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
58b0: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
58c0: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
58d0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
58e0: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
58f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
5900: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
5910: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
5920: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
5930: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
5940: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
5950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
5960: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5970: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
5980: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
5990: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
59a0: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
59b0: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
59c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
59d0: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
59e0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
59f0: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
5a00: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5a10: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
5a20: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
5a30: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
5a40: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
5a50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
5a60: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
5a70: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
5a80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
5a90: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
5aa0: 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63  ET );.  s = osFc
5ab0: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
5ac0: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
5ad0: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
5ae0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
5af0: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
5b00: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
5b10: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
5b20: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
5b30: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
5b40: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
5b50: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
5b60: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
5b70: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
5b80: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
5b90: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
5ba0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
5bb0: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
5bc0: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
5bd0: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46  l2 = *p;.    osF
5be0: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
5bf0: 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20  , &l2);.    if( 
5c00: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  l2.l_type==F_RDL
5c10: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5c20: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20  e = "RDLCK";.   
5c30: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5c40: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
5c50: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5c60: 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  WRLCK";.    }els
5c70: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
5c80: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
5c90: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
5ca0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
5cb0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
5cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5cd0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
5ce0: 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61  cntl-failure-rea
5cf0: 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64  son: %s %d %d %d
5d00: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70  \n",.       zTyp
5d10: 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61  e, (int)l2.l_sta
5d20: 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65  rt, (int)l2.l_le
5d30: 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64  n, (int)l2.l_pid
5d40: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d  );.  }.  errno =
5d50: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72   savedErrno;.  r
5d60: 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65  eturn s;.}.#unde
5d70: 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e  f osFcntl.#defin
5d80: 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72  e osFcntl lockTr
5d90: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
5da0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
5db0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  */../*.** Retry 
5dc0: 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  ftruncate() call
5dd0: 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20  s that fail due 
5de0: 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74  to EINTR.*/.stat
5df0: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
5e00: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
5e10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
5e20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
5e30: 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61  { rc = osFtrunca
5e40: 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65  te(h,sz); }while
5e50: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
5e60: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
5e70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5e80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
5e90: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
5ea0: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
5eb0: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
5ec0: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
5ed0: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
5ee0: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
5ef0: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
5f00: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
5f10: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
5f20: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
5f30: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
5f40: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
5f50: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
5f60: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
5f70: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
5f80: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
5f90: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
5fa0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
5fb0: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
5fc0: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
5fd0: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
5fe0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5ff0: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
6000: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
6010: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
6020: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
6030: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
6040: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
6050: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
6060: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
6070: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
6080: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
6090: 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20  Error) {.#if 0. 
60a0: 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
60b0: 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e   this code was n
60c0: 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74  ot commented out
60d0: 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69  . In theory, thi
60e0: 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68  s branch.  ** sh
60f0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69  ould never be hi
6100: 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  t, as this funct
6110: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
6120: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a  be called after.
6130: 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72    ** a locking-r
6140: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  elated function 
6150: 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68  (i.e. fcntl()) h
6160: 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  as returned non-
6170: 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74  zero with.  ** t
6180: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
6190: 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  o as the first a
61a0: 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61  rgument. Since a
61b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73   system call has
61c0: 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72   failed,.  ** er
61d0: 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  rno should be no
61e0: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  n-zero..  **.  *
61f0: 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20  * Despite this, 
6200: 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20  if errno really 
6210: 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c  is zero, we stil
6220: 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  l don't want to 
6230: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
6240: 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65  TE_OK. The syste
6250: 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61  m call failed, a
6260: 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65  nd *some* SQLite
6270: 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65   error should be
6280: 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64  .  ** propagated
6290: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c   back to the cal
62a0: 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20  ler. Commenting 
62b0: 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20  this branch out 
62c0: 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20  means errno==0. 
62d0: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64   ** will be hand
62e0: 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61  led by the "defa
62f0: 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77  ult:" case below
6300: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a  ..  */.  case 0:
6310: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
6320: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
6330: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
6340: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
6350: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
6360: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
6370: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
6380: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
6390: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
63a0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
63b0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
63c0: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
63d0: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
63e0: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
63f0: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6400: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6410: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6420: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
6430: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
6440: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
6450: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
6460: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
6470: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
6480: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
6490: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
64a0: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  ERR_LOCK) || .  
64b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
64c0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
64d0: 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20  RR_UNLOCK) || . 
64e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
64f0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6500: 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20  ERR_RDLOCK) ||. 
6510: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
6520: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
6530: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
6540: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
6550: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
6560: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
6570: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
6580: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
6590: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
65a0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
65b0: 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69   .  /* EDEADLK i
65c0: 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
65d0: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e  if a call to fcn
65e0: 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20  tl(F_SETLKW) is 
65f0: 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74  made. And.  ** t
6600: 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  his module never
6610: 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61   makes such a ca
6620: 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65  ll. And the code
6630: 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c   in SQLite itsel
6640: 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20  f .  ** asserts 
6650: 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52  that SQLITE_IOER
6660: 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76  R_BLOCKED is nev
6670: 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72  er returned. For
6680: 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20   these reasons. 
6690: 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73   ** this case is
66a0: 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
66b0: 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74  out. If the syst
66c0: 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e  em does set errn
66d0: 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20  o to EDEADLK,.  
66e0: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53  ** the default S
66f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
6700: 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74  code will be ret
6710: 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a  urned. */.#if 0.
6720: 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a    case EDEADLK:.
6730: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6740: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
6750: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
6760: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
6770: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
6780: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
6790: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
67a0: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
67b0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
67c0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
67d0: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
67e0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
67f0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6800: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6810: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
6820: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
6830: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
6840: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
6850: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
6860: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
6870: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
6880: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
6890: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
68a0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
68b0: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
68c0: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
68d0: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
68e0: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
68f0: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
6900: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
6910: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
6920: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6940: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
6950: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
6960: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
6970: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
6980: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
6990: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
69a0: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
69b0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
69c0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
69d0: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
69e0: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
69f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
6a00: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a  rr;.  }.}.../***
6a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
6a70: 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65  egin Unique File
6a80: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
6a90: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
6ab0: 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f  * On most versio
6ac0: 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63  ns of unix, we c
6ad0: 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20  an get a unique 
6ae0: 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79  ID for a file by
6af0: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a   concatenating.*
6b00: 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d  * the device num
6b10: 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64  ber and the inod
6b20: 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74  e number.  But t
6b30: 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  his does not wor
6b40: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
6b50: 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75   On VxWorks, a u
6b60: 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75  nique file id mu
6b70: 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  st be based on t
6b80: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
6b90: 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  ename..**.** A p
6ba0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
6bb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
6bc0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6bd0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
6be0: 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65  a.** unique file
6bf0: 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20   ID in VxWorks. 
6c00: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
6c10: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
6c20: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63   contains.** a c
6c30: 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  opy of the canon
6c40: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20  ical filename.  
6c50: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
6c60: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e  reference count.
6c70: 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74    .** The struct
6c80: 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64  ure is reclaimed
6c90: 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
6ca0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
6cb0: 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a  it drops to.** z
6cc0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ero..**.** There
6cd0: 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20   are never very 
6ce0: 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20  many files open 
6cf0: 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20  at one time and 
6d00: 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a  lookups are not.
6d10: 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ** a performance
6d20: 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20  -critical path, 
6d30: 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69  so it is suffici
6d40: 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65  ent to put these
6d50: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f  .** structures o
6d60: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  n a linked list.
6d70: 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72  .*/.struct vxwor
6d80: 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72  ksFileId {.  str
6d90: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6da0: 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65  d *pNext;  /* Ne
6db0: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  xt in a list of 
6dc0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e  them all */.  in
6dd0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6df0: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
6e00: 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20  ces to this one 
6e10: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6e40: 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  the zCanonicalNa
6e50: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  me[] string */. 
6e60: 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61   char *zCanonica
6e70: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  lName;         /
6e80: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * Canonical file
6e90: 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  name */.};..#if 
6ea0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a  OS_VXWORKS./* .*
6eb0: 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c  * All unique fil
6ec0: 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20  enames are held 
6ed0: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6ee0: 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a   headed by this.
6ef0: 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a  ** variable:.*/.
6f00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6f10: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6f20: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30  orksFileList = 0
6f30: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  ;../*.** Simplif
6f40: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  y a filename int
6f50: 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20  o its canonical 
6f60: 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e  form.** by makin
6f70: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
6f80: 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  changes:.**.**  
6f90: 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74  * removing any t
6fa0: 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c  railing and dupl
6fb0: 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f  icate /.**  * co
6fc0: 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a  nvert /./ into j
6fd0: 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ust /.**  * conv
6fe0: 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65  ert /A/../ where
6ff0: 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65   A is any simple
7000: 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20   name into just 
7010: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
7020: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
7030: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
7040: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
7050: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
7060: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
7070: 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65  n z[0..n-1].  Re
7080: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7090: 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  of.** characters
70a0: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69   in the simplifi
70b0: 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  ed name..*/.stat
70c0: 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69  ic int vxworksSi
70d0: 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20  mplifyName(char 
70e0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
70f0: 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28  t i, j;.  while(
7100: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
7110: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
7120: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
7130: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
7140: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
7150: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
7160: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7170: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
7180: 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a  .' && i+2<n && z
7190: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
71a0: 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
71b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
71c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
71d0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
71e0: 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+3<n && z[i+2]
71f0: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d  =='.' && z[i+3]=
7200: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
7210: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b  while( j>0 && z[
7220: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
7230: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
7240: 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  j>0 ){ j--; }.  
7250: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
7260: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7270: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7280: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
7290: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
72a0: 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
72b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69  /*.** Find a uni
72c0: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
72d0: 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75  the given absolu
72e0: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
72f0: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
7300: 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73  r to the vxworks
7310: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
7320: 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20  This pointer is 
7330: 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69  the unique.** fi
7340: 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  le ID..**.** The
7350: 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74   nRef field of t
7360: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
7370: 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65   object is incre
7380: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  mented before.**
7390: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72   the object is r
73a0: 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20  eturned.  A new 
73b0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
73c0: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
73d0: 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ** and added to 
73e0: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
73f0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
7400: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
7410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
7420: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
7430: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
7440: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7450: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e  leId *vxworksFin
7460: 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68  dFileId(const ch
7470: 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  ar *zAbsoluteNam
7480: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  e){.  struct vxw
7490: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77  orksFileId *pNew
74a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61  ;         /* sea
74b0: 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20  rch key and new 
74c0: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72  file ID */.  str
74d0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
74e0: 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20  d *pCandidate;  
74f0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
7500: 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69  over existing fi
7510: 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  le IDs */.  int 
7520: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62  /* Length of zAb
7550: 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e  soluteName strin
7560: 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
7570: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d  zAbsoluteName[0]
7580: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28  =='/' );.  n = (
7590: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f  int)strlen(zAbso
75a0: 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  luteName);.  pNe
75b0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
75c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
75d0: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
75e0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
75f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
7600: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
7610: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
7620: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
7630: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7640: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
7650: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
7660: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
7670: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7680: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
7690: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
76a0: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
76b0: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
76c0: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
76d0: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
76e0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
76f0: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
7700: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7710: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
7720: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
7730: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
7740: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
7750: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
7760: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
7770: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
7780: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
7790: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
77a0: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
77b0: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
77c0: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
77d0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
77e0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
77f0: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
7800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
7810: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
7820: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
7830: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
7840: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
7850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
7860: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
7870: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
7880: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
7890: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
78a0: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
78b0: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
78c0: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
78d0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
78e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
78f0: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
7900: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
7910: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7920: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7930: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
7940: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
7950: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
7960: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
7970: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
7980: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
7990: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
79a0: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
79b0: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
79c0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
79d0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
79e0: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
79f0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7a00: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
7a10: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
7a20: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
7a30: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
7a40: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7a50: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
7a60: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
7a70: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
7a80: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
7a90: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
7aa0: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
7ab0: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
7ac0: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
7ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7ae0: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
7af0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7b00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
7b10: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
7b30: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
7b40: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
7b50: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
7b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
7b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
7bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c20: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
7c30: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
7c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
7c60: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
7c70: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
7c80: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
7c90: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
7ca0: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
7cb0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
7cc0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
7cd0: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
7ce0: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
7cf0: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
7d00: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
7d10: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
7d20: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
7d30: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
7d40: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
7d50: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
7d60: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
7d70: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
7d80: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
7d90: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
7da0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
7db0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
7dc0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7dd0: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
7de0: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
7df0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
7e00: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
7e10: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
7e20: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
7e30: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
7e40: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
7e50: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
7e60: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
7e70: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
7e80: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
7e90: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
7ea0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
7eb0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
7ec0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
7ed0: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
7ee0: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
7ef0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
7f00: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
7f10: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
7f20: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
7f30: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
7f40: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
7f50: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
7f60: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
7f70: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
7f80: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
7f90: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
7fa0: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
7fb0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
7fc0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
7fd0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7fe0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
7ff0: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
8000: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
8010: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
8020: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
8030: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
8040: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
8050: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
8060: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
8070: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
8080: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
8090: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
80a0: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
80b0: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
80c0: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
80d0: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
80e0: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
80f0: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
8100: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
8110: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
8120: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
8130: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
8140: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
8150: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
8160: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
8170: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
8180: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
8190: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
81a0: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
81b0: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
81c0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
81d0: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
81e0: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
81f0: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
8200: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8210: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
8220: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
8230: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
8240: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
8250: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
8260: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
8270: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
8280: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
8290: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
82a0: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
82b0: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
82c0: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
82d0: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
82e0: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
82f0: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
8300: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
8310: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
8320: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
8330: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
8340: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
8350: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
8360: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
8370: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
8380: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
8390: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
83a0: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
83b0: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
83c0: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
83d0: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
83e0: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
83f0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
8400: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
8410: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
8420: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8430: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
8440: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
8450: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
8460: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
8470: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
8480: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
8490: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
84a0: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
84b0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
84c0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
84d0: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
84e0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
84f0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
8500: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
8510: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
8520: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
8530: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
8540: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
8550: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
8560: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
8570: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
8580: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
8590: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
85a0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
85b0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
85c0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
85d0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
85e0: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
85f0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
8600: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
8610: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
8620: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
8630: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
8640: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
8650: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
8660: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
8670: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
8680: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
8690: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
86a0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
86b0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
86c0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
86d0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
86e0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
86f0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
8700: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
8710: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
8720: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
8730: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
8740: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
8750: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
8760: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
8770: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
8780: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
8790: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
87a0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
87b0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
87c0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
87d0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
87e0: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
87f0: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
8800: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
8810: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
8820: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
8830: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8840: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
8850: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
8860: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
8870: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
8880: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
8890: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
88a0: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
88b0: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
88c0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
88d0: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
88e0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
88f0: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
8900: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
8910: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
8920: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
8930: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
8940: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
8950: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
8960: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
8970: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
8980: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
8990: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
89a0: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
89b0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
89c0: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
89d0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
89e0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
89f0: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
8a00: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
8a10: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
8a20: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
8a30: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
8a40: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
8a50: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
8a60: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
8a70: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
8a80: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
8a90: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
8aa0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
8ab0: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
8ac0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
8ad0: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
8ae0: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
8af0: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
8b00: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
8b10: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
8b20: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
8b30: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
8b40: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
8b50: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
8b60: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
8b70: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
8b80: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
8b90: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
8ba0: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
8bb0: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
8bc0: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
8bd0: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
8be0: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
8bf0: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
8c00: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
8c10: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
8c20: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
8c30: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
8c40: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
8c50: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
8c60: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
8c70: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
8c80: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
8c90: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
8ca0: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
8cb0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
8cc0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
8cd0: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
8ce0: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
8cf0: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
8d00: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
8d10: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
8d20: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
8d30: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
8d40: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
8d50: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
8d60: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
8d70: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
8d80: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
8d90: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
8da0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
8db0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
8dc0: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
8dd0: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
8de0: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
8df0: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
8e00: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
8e10: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
8e20: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
8e30: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
8e40: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
8e50: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
8e60: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
8e70: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
8e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
8e90: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
8ea0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
8eb0: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
8ec0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8ed0: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
8ee0: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
8ef0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
8f00: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
8f10: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
8f20: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
8f30: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
8f40: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
8f50: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
8f60: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
8f70: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
8f80: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8fa0: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
8fb0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
8fc0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
8fd0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
8fe0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
8ff0: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
9000: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
9010: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
9020: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
9030: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
9040: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
9050: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
9060: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
9070: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
9080: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
9090: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
90a0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
90b0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
90c0: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
90d0: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
90e0: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
90f0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
9100: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
9110: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
9120: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
9130: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
9140: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
9150: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
9160: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
9170: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
9180: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
9190: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
91a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
91b0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
91c0: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
91d0: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
91e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
91f0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
9200: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
9210: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
9220: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
9230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9240: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
9250: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
9260: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
9270: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
9280: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
9290: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
92a0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
92b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
92c0: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
92d0: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
92e0: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
92f0: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
9300: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9320: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
9330: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
9340: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
9350: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
9360: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
9370: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
9380: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
9390: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
93a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
93b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
93c0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
93d0: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
93e0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
93f0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
9400: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
9410: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
9420: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
9430: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
9440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
9450: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
9460: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
9470: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9480: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
9490: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
94a0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
94b0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
94c0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
94d0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
94e0: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
94f0: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
9500: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
9510: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
9520: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
9530: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9550: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
9560: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
9570: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
9580: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
9590: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
95a0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
95b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
95c0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
95d0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
95e0: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
95f0: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
9600: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
9610: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
9620: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
9630: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
9640: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
9650: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
9660: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
9670: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
9680: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
9690: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
96a0: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
96b0: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
96c0: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
96d0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
96e0: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
96f0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
9700: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
9710: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
9720: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
9730: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
9740: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9750: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
9760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
9770: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
9780: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
9790: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
97a0: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
97b0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
97c0: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
97d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
97e0: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
97f0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
9800: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
9810: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
9820: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
9830: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
9840: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
9850: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
9860: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
9870: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
9880: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
9890: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
98a0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
98b0: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
98c0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
98d0: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
98e0: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
98f0: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
9900: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9920: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
9930: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9940: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
9950: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9960: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
9970: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
9980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
9990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
99a0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
99b0: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
99c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
99f0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
9a00: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
9a10: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
9a20: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
9a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
9a40: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
9a50: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
9a60: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
9a70: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
9a80: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
9a90: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
9aa0: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
9ab0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
9ac0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9ad0: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
9ae0: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
9af0: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
9b00: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
9b10: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
9b20: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
9b30: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
9b40: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
9b50: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
9b60: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
9b70: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
9b80: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
9b90: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
9ba0: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
9bb0: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
9bc0: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
9bd0: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
9be0: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
9bf0: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
9c00: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
9c10: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
9c20: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
9c30: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
9c40: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
9c50: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
9c60: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
9c70: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
9c80: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
9c90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
9ca0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
9cb0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9cc0: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
9cd0: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
9ce0: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
9cf0: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
9d00: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
9d10: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
9d20: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
9d30: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
9d40: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
9d50: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9d60: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
9d70: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
9d80: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
9d90: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9da0: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
9db0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
9dc0: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
9dd0: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
9de0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9df0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
9e00: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
9e10: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
9e20: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
9e30: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
9e40: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
9e50: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
9e60: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
9e70: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
9e80: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
9e90: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
9ea0: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
9eb0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
9ec0: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
9ed0: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
9ee0: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
9ef0: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
9f00: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
9f10: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
9f20: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
9f30: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
9f40: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
9f50: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
9f60: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
9f70: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
9f80: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
9f90: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
9fa0: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
9fb0: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
9fc0: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
9fd0: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
9fe0: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
9ff0: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
a000: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
a010: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
a020: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
a030: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
a040: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
a050: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
a060: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
a070: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
a080: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
a090: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
a0a0: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
a0b0: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
a0c0: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
a0d0: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
a0e0: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
a0f0: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
a100: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
a110: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
a120: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
a130: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
a140: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
a150: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
a160: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
a170: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
a180: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
a190: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
a1a0: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
a1b0: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
a1c0: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
a1d0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
a1e0: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
a1f0: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
a200: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
a210: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
a220: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
a230: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
a240: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
a250: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
a260: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
a270: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
a280: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
a290: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
a2a0: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
a2b0: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
a2c0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
a2d0: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
a2e0: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
a2f0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
a300: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
a310: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
a320: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
a330: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
a340: 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69   all file descri
a350: 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64  ptors accumuated
a360: 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64   in the unixInod
a370: 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c  eInfo->pUnused l
a380: 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ist..*/ .static 
a390: 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e  void closePendin
a3a0: 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  gFds(unixFile *p
a3b0: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
a3c0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
a3d0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
a3e0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
a3f0: 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  p;.  UnixUnusedF
a400: 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  d *pNext;.  for(
a410: 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  p=pInode->pUnuse
a420: 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  d; p; p=pNext){.
a430: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
a440: 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74  Next;.    robust
a450: 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d  _close(pFile, p-
a460: 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  >fd, __LINE__);.
a470: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a480: 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64  (p);.  }.  pInod
a490: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
a4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
a4b0: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
a4c0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
a4d0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
a4e0: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
a4f0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
a500: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
a510: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
a520: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
a530: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
a540: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
a550: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
a560: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
a570: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
a580: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
a590: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a5a0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a5b0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
a5c0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
a5d0: 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  () );.  if( ALWA
a5e0: 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20  YS(pInode) ){.  
a5f0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
a600: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
a610: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
a620: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a630: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
a640: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
a650: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
a660: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
a670: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
a680: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a690: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  e->pPrev->pNext=
a6a0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a6b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
a6c0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
a6d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a6e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
a6f0: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d  sert( inodeList=
a700: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a710: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
a720: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a730: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a740: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b  pInode->pNext ){
a750: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a760: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
a770: 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b  pPrev==pInode );
a780: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
a790: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a7a0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20  pInode->pPrev;. 
a7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a7c0: 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65  ite3_free(pInode
a7d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a7e0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
a7f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
a800: 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e  ocate the unixIn
a810: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  odeInfo object t
a820: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
a830: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
a840: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61  iptor.  Create a
a850: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
a860: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
a870: 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68  eturn value migh
a880: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
a890: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
a8a0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ccurs..**.** The
a8b0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
a8c0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
a8d0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
a8e0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
a8f0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
a900: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
a910: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
a920: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
a930: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
a940: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65  ic int findInode
a950: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
a960: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
a970: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
a980: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
a990: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
a9a0: 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ey */.  unixInod
a9b0: 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20  eInfo **ppInode 
a9c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
a9d0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a9e0: 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a  fo object here *
a9f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
aa20: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
aa30: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
aa60: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
aa70: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
aa80: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
aa90: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
aaa0: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
aab0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f  unixInodeInfo */
aac0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
aad0: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
aae0: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
aaf0: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
ab00: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
ab10: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20  fo *pInode = 0; 
ab20: 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65      /* Candidate
ab30: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
ab40: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65  bject */..  asse
ab50: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
ab60: 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  d() );..  /* Get
ab70: 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72   low-level infor
ab80: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
ab90: 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61   file that we ca
aba0: 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63  n used to.  ** c
abb0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e  reate a unique n
abc0: 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ame for the file
abd0: 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46  ..  */.  fd = pF
abe0: 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f  ile->h;.  rc = o
abf0: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
ac00: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
ac10: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
ac20: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
ac30: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
ac40: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
ac50: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
ac60: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
ac70: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
ac80: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
ac90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
aca0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
acb0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
acc0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
acd0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
ace0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
acf0: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
ad00: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
ad10: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
ad20: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
ad30: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
ad40: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
ad50: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
ad60: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
ad70: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
ad80: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
ad90: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
ada0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
adb0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
adc0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
add0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
ade0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
adf0: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
ae00: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
ae10: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
ae20: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
ae30: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
ae40: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
ae50: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
ae60: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
ae70: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
ae80: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
ae90: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
aea0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
aeb0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
aec0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
aed0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
aee0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
aef0: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
af00: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
af10: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
af20: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
af30: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
af40: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
af50: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
af60: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
af70: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
af80: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
af90: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
afa0: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
afb0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
afc0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
afd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
afe0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
aff0: 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  }.    rc = osFst
b000: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
b010: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
b020: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
b030: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
b040: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
b050: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
b060: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
b070: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
b080: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
b090: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
b0a0: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
b0b0: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
b0c0: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
b0d0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
b0e0: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
b0f0: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
b100: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  no;.#endif.  pIn
b110: 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
b120: 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65  .  while( pInode
b130: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
b140: 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  Id, &pInode->fil
b150: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
b160: 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  Id)) ){.    pIno
b170: 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
b180: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  xt;.  }.  if( pI
b190: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  node==0 ){.    p
b1a0: 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  Inode = sqlite3_
b1b0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
b1c0: 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69  pInode) );.    i
b1d0: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
b1e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b1f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
b200: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
b210: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
b220: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
b230: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
b240: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
b250: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
b260: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20     pInode->nRef 
b270: 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  = 1;.    pInode-
b280: 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69  >pNext = inodeLi
b290: 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  st;.    pInode->
b2a0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
b2b0: 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69  f( inodeList ) i
b2c0: 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20  nodeList->pPrev 
b2d0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e  = pInode;.    in
b2e0: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
b2f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b300: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Inode->nRef++;. 
b310: 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20   }.  *ppInode = 
b320: 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e  pInode;.  return
b330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
b340: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e  /*.** Check a un
b350: 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61  ixFile that is a
b360: 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69   database.  Veri
b370: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
b380: 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72  :.**.** (1) Ther
b390: 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
b3a0: 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68   hard link on th
b3b0: 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68  e file.** (2) Th
b3c0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  e file is not a 
b3d0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a  symbolic link.**
b3e0: 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61   (3) The file ha
b3f0: 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d  s not been renam
b400: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a  ed or unlinked.*
b410: 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74  *.** Issue sqlit
b420: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b430: 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61  RNING,...) messa
b440: 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ges if anything 
b450: 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f  is not right..*/
b460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
b470: 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69  ifyDbFile(unixFi
b480: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
b490: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
b4a0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
b4b0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b4c0: 26 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  & UNIXFILE_WARNE
b4d0: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  D ){.    /* One 
b4e0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 66  or more of the f
b4f0: 6f 6c 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e 67  ollowing warning
b500: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b510: 65 65 6e 20 69 73 73 75 65 64 2e 20 20 44 6f 20  een issued.  Do 
b520: 6e 6f 74 0a 20 20 20 20 2a 2a 20 72 65 70 65 61  not.    ** repea
b530: 74 20 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f 74  t them so as not
b540: 20 74 6f 20 63 6c 75 74 74 65 72 20 74 68 65 20   to clutter the 
b550: 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 20  error log */.   
b560: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
b570: 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c  c = osFstat(pFil
b580: 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69  e->h, &buf);.  i
b590: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
b5a0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b5b0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e  TE_WARNING, "can
b5c0: 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66 69 6c  not fstat db fil
b5d0: 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  e %s", pFile->zP
b5e0: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
b5f0: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
b600: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
b610: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b620: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
b630: 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  k==0 && (pFile->
b640: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
b650: 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  FILE_DELETE)==0 
b660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b670: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b680: 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65  G, "file unlinke
b690: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b6a0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b6b0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  ;.    pFile->ctr
b6c0: 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
b6d0: 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72  LE_WARNED;.    r
b6e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
b6f0: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
b700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b710: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b720: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
b730: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
b740: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
b750: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
b760: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
b770: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
b780: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
b790: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 0a  File->pInode!=0.
b7a0: 20 20 20 26 26 20 28 28 72 63 20 3d 20 6f 73 53     && ((rc = osS
b7b0: 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  tat(pFile->zPath
b7c0: 2c 20 26 62 75 66 29 29 21 3d 30 0a 20 20 20 20  , &buf))!=0.    
b7d0: 20 20 20 7c 7c 20 62 75 66 2e 73 74 5f 69 6e 6f     || buf.st_ino
b7e0: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
b7f0: 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 0a 20 20 29  >fileId.ino).  )
b800: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b810: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b820: 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20  , "file renamed 
b830: 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c  while open: %s",
b840: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
b850: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
b860: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
b870: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
b880: 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  urn;.  }.}.../*.
b890: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b8a0: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
b8b0: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
b8c0: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
b8d0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
b8e0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
b8f0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
b900: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
b910: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
b920: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
b930: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
b940: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
b950: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
b960: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
b970: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
b980: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
b990: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
b9a0: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
b9b0: 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
b9c0: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
b9d0: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
b9e0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
b9f0: 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
ba00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ba10: 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
ba20: 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
ba30: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ba40: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
ba50: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
ba60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
ba70: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
ba80: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
ba90: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e  t( pFile );.  un
baa0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
bab0: 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
bac0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
bad0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
bae0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
baf0: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
bb00: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
bb10: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
bb20: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
bb30: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
bb40: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
bb50: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
bb60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65  ;.  }..  /* Othe
bb70: 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
bb80: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
bb90: 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23  holds it..  */.#
bba0: 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  ifndef __DJGPP__
bbb0: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
bbc0: 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f   && !pFile->pIno
bbd0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
bbe0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
bbf0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c  lock lock;.    l
bc00: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
bc10: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
bc20: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
bc30: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c  RVED_BYTE;.    l
bc40: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
bc50: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
bc60: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66   F_WRLCK;.    if
bc70: 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  ( osFcntl(pFile-
bc80: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
bc90: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ck) ){.      rc 
bca0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
bcb0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
bcc0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
bcd0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
bce0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
bcf0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
bd00: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
bd10: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
bd20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
bd30: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
bd40: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
bd50: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
bd60: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
bd70: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
bd80: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
bd90: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
bda0: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
bdb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
bdc0: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
bdd0: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
bde0: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
bdf0: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
be00: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
be10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
be20: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
be30: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
be40: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
be50: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
be60: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
be70: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
be80: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
be90: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
bea0: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
beb0: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
bec0: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
bed0: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
bee0: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
bef0: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
bf00: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
bf10: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
bf20: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
bf30: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
bf40: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
bf50: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
bf60: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
bf70: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
bf80: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
bf90: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
bfa0: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
bfb0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
bfc0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
bfd0: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
bfe0: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
bff0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c000: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
c010: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
c020: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
c030: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
c040: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
c050: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
c060: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
c070: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
c080: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
c090: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
c0a0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
c0b0: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
c0c0: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
c0d0: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
c0e0: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
c0f0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
c100: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
c110: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
c120: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
c130: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
c140: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
c150: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
c160: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
c170: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
c180: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
c190: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
c1a0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
c1b0: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
c1c0: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
c1d0: 20 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63    if( ((pFile->c
c1e0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
c1f0: 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20  ILE_EXCL)!=0 || 
c200: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
c210: 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46  Lock).   && ((pF
c220: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
c230: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
c240: 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  )==0).  ){.    i
c250: 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
c260: 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
c270: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
c280: 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73   lock;.      ass
c290: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
c2a0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c  ck==0 );.      l
c2b0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
c2c0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
c2d0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
c2e0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
c2f0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
c300: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
c310: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c320: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_WRLCK;.      r
c330: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
c340: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
c350: 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  lock);.      if(
c360: 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72   rc<0 ) return r
c370: 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  c;.      pInode-
c380: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20  >bProcessLock = 
c390: 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  1;.      pInode-
c3a0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65  >nLock++;.    }e
c3b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
c3c0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
c3d0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
c3e0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
c3f0: 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20  ETLK, pLock);.  
c400: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c410: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c420: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
c430: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
c440: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
c450: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
c460: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c470: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
c480: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
c490: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
c4a0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
c4b0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
c4c0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
c4d0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
c4e0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
c4f0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
c500: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
c510: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
c520: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
c530: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
c540: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
c550: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
c560: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
c570: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
c580: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
c590: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
c5a0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
c5b0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
c5c0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
c5d0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
c5e0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
c5f0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
c600: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
c610: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
c620: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
c630: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
c640: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
c650: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
c660: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
c670: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
c680: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
c690: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
c6a0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
c6b0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
c6c0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
c6d0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
c6e0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
c6f0: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
c700: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
c710: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
c720: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
c730: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
c740: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
c750: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
c760: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
c770: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
c780: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
c790: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
c7a0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
c7b0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
c7c0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
c7d0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
c7e0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
c7f0: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
c800: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
c810: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
c820: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
c830: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
c840: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
c850: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
c860: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
c870: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
c880: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
c890: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
c8a0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
c8b0: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
c8c0: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
c8d0: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
c8e0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
c8f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
c900: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
c910: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
c920: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
c930: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
c940: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
c950: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
c960: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
c970: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
c980: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
c990: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
c9a0: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
c9b0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
c9c0: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
c9d0: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
c9e0: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
c9f0: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
ca00: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
ca10: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
ca20: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
ca30: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
ca40: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
ca50: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
ca60: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
ca70: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
ca80: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
ca90: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
caa0: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
cab0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
cac0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
cad0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
cae0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
caf0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
cb00: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
cb10: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
cb20: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
cb30: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
cb40: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
cb50: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
cb60: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
cb70: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
cb80: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
cb90: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
cba0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
cbb0: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
cbc0: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
cbd0: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
cbe0: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
cbf0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
cc00: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
cc10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
cc20: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
cc30: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
cc40: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
cc50: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
cc60: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
cc70: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
cc80: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
cc90: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
cca0: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
ccb0: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
ccc0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
ccd0: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
cce0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
ccf0: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
cd00: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
cd10: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
cd20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
cd30: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
cd40: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
cd50: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
cd60: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
cd70: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
cd80: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
cd90: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
cda0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
cdb0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
cdc0: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
cdd0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
cde0: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
cdf0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
ce00: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
ce10: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
ce20: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
ce30: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
ce40: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
ce50: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
ce60: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
ce70: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
ce80: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
ce90: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
cea0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
ceb0: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
cec0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
ced0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
cee0: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
cef0: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
cf00: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
cf10: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
cf20: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
cf30: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
cf40: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
cf50: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
cf60: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
cf70: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
cf80: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
cf90: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
cfa0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
cfb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
cfc0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
cfd0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
cfe0: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
cff0: 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
d000: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
d010: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30    int tErrno = 0
d020: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
d030: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
d040: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
d050: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
d060: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
d070: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
d080: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
d090: 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
d0a0: 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
d0b0: 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ck),.      azFil
d0c0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e  eLock(pFile->pIn
d0d0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
d0e0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
d0f0: 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
d100: 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
d110: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
d120: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
d130: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
d140: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
d150: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
d160: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
d170: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
d180: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
d190: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
d1a0: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
d1b0: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
d1c0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d1d0: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
d1e0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
d1f0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
d200: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
d210: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
d220: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
d230: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
d240: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
d250: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d260: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
d270: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
d280: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
d290: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
d2a0: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
d2b0: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
d2c0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
d2d0: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
d2e0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
d2f0: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
d300: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
d310: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
d320: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
d330: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
d340: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
d350: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
d360: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
d370: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
d380: 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
d390: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
d3a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d3b0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d3c0: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
d3d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
d3e0: 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
d3f0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
d400: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
d410: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
d420: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
d430: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
d440: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
d450: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
d460: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
d470: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
d480: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
d490: 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
d4a0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
d4b0: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
d4c0: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
d4d0: 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
d4e0: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
d4f0: 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
d500: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
d510: 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
d520: 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
d530: 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
d540: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
d550: 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f  .          (pIno
d560: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
d570: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
d580: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
d590: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
d5a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
d5b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
d5c0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
d5d0: 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
d5e0: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
d5f0: 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
d600: 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
d610: 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
d620: 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
d630: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
d640: 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
d650: 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
d660: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
d670: 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
d680: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d690: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
d6a0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d6b0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d6c0: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
d6d0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
d6e0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
d6f0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
d700: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
d710: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
d720: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
d730: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
d740: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
d750: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
d760: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
d770: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
d780: 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
d790: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
d7a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
d7b0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ock;.  }...  /* 
d7c0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
d7d0: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
d7e0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
d7f0: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
d800: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
d810: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
d820: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
d830: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
d840: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
d850: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
d860: 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  */.  lock.l_len 
d870: 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  = 1L;.  lock.l_w
d880: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
d890: 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  ;.  if( eFileLoc
d8a0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
d8b0: 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
d8c0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
d8d0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
d8e0: 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
d8f0: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
d900: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46  ock.l_type = (eF
d910: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d920: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
d930: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
d940: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
d950: 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20  G_BYTE;.    if( 
d960: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
d970: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
d980: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d990: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
d9a0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d9b0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d9c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
d9d0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
d9e0: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
d9f0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
da00: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
da10: 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rno;.      }.   
da20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
da30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
da40: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
da50: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
da60: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
da70: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
da80: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
da90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
daa0: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
dab0: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
dac0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
dad0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
dae0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
daf0: 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
db00: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
db10: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
db20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
db30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
db40: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
db50: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
db60: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
db70: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
db80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
db90: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
dba0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
dbb0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
dbc0: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
dbd0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
dbe0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
dbf0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
dc00: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
dc10: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  ERR_LOCK);.    }
dc20: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
dc30: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
dc40: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
dc50: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
dc60: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
dc70: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
dc80: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
dc90: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
dca0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
dcb0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
dcc0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
dcd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
dce0: 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77  s could happen w
dcf0: 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f  ith a network mo
dd00: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72  unt */.      tEr
dd10: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dd20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
dd30: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
dd40: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20    }..    if( rc 
dd50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ){.      if( rc!
dd60: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
dd70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
dd80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
dd90: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
dda0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
ddb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ddc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ddd0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
dde0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
ddf0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
de00: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
de10: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
de20: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
de30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
de40: 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
de50: 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
de60: 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
de70: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
de80: 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
de90: 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
dea0: 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
deb0: 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
dec0: 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
ded0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
dee0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
def0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
df00: 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
df10: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
df20: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
df30: 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
df40: 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
df50: 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
df60: 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
df70: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
df80: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
df90: 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
dfa0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
dfb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
dfc0: 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61   F_WRLCK;..    a
dfd0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
dfe0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
dff0: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  || eFileLock==EX
e000: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
e010: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
e020: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
e030: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
e040: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
e050: 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f  D_BYTE;.      lo
e060: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
e070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e080: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e090: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
e0a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e0b0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
e0c0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78   }..    if( unix
e0d0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e0e0: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
e0f0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e100: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e110: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
e120: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
e130: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
e140: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
e150: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
e160: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
e170: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
e180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e190: 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51   }.  ..#ifdef SQ
e1a0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
e1b0: 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73  Set up the trans
e1c0: 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63  action-counter c
e1d0: 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66  hange checking f
e1e0: 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  lags when.  ** t
e1f0: 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
e200: 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20  m a SHARED to a 
e210: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20  RESERVED lock.  
e220: 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20  The change.  ** 
e230: 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52  from SHARED to R
e240: 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68  ESERVED marks th
e250: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
e260: 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69   normal.  ** wri
e270: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f  te operation (no
e280: 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  t a hot journal 
e290: 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a  rollback)..  */.
e2a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e2b0: 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d  _OK.   && pFile-
e2c0: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52  >eFileLock<=SHAR
e2d0: 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46  ED_LOCK.   && eF
e2e0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
e2f0: 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20  D_LOCK.  ){.    
e300: 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
e310: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46  Chng = 0;.    pF
e320: 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
e330: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  0;.    pFile->in
e340: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b  NormalWrite = 1;
e350: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
e360: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e370: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
e380: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
e390: 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
e3a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
e3b0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
e3c0: 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
e3d0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
e3e0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
e3f0: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
e400: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
e410: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
e420: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
e430: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  }..end_lock:.  u
e440: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
e450: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
e460: 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75  K    %d %s %s (u
e470: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
e480: 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
e490: 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
e4a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
e4b0: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
e4c0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
e4d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
e4e0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e4f0: 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68  r used by file h
e500: 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74  andle pFile to t
e510: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
e520: 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74  .** pUnused list
e530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e540: 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e   setPendingFd(un
e550: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
e560: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
e570: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
e580: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
e590: 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69  nusedFd *p = pFi
e5a0: 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  le->pUnused;.  p
e5b0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
e5c0: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e  ->pUnused;.  pIn
e5d0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  ode->pUnused = p
e5e0: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d  ;.  pFile->h = -
e5f0: 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75  1;.  pFile->pUnu
e600: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
e610: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
e620: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
e630: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
e640: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
e650: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
e660: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
e670: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
e680: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
e690: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e6a0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
e6b0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
e6c0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
e6d0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
e6e0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
e6f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
e700: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
e710: 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
e720: 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
e730: 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
e740: 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
e750: 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
e760: 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
e770: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
e780: 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
e790: 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
e7a0: 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
e7b0: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
e7c0: 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
e7d0: 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
e7e0: 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
e7f0: 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
e800: 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
e810: 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
e820: 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
e830: 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
e840: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
e850: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
e860: 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
e870: 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
e880: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
e890: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
e8a0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
e8b0: 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61  FileLock, int ha
e8c0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a  ndleNFSUnlock){.
e8d0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
e8e0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
e8f0: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
e900: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
e910: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
e920: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e930: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
e940: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
e950: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
e960: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
e970: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
e980: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
e990: 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
e9a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e9b0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
e9c0: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
e9d0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
e9e0: 65 64 2c 0a 20 20 20 20 20 20 67 65 74 70 69 64  ed,.      getpid
e9f0: 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ()));..  assert(
ea00: 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
ea10: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
ea20: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ea30: 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
ea40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ea50: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
ea60: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
ea70: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
ea80: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
ea90: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
eaa0: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
eab0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
eac0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
ead0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
eae0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
eaf0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
eb00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
eb10: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
eb20: 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
eb30: 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
eb40: 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
eb50: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
eb60: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
eb70: 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
eb80: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
eb90: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
eba0: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
ebb0: 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
ebc0: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
ebd0: 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
ebe0: 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
ebf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
ec00: 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
ec10: 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
ec20: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
ec30: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
ec40: 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
ec50: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
ec60: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
ec70: 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
ec80: 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
ec90: 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
eca0: 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
ecb0: 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
ecc0: 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
ecd0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
ece0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46  n..    */.    pF
ecf0: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
ed00: 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
ed10: 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
ed20: 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
ed30: 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
ed40: 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
ed50: 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
ed60: 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c  ** before establ
ed70: 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c  ishing the readl
ed80: 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  ock - to avoid a
ed90: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
eda0: 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20  we downgrade.   
edb0: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20   ** the lock in 
edc0: 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61  2 blocks, so tha
edd0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61  t part of the ra
ede0: 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65  nge will be cove
edf0: 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a  red by a .    **
ee00: 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69   write lock unti
ee10: 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f  l the rest is co
ee20: 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20  vered by a read 
ee30: 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a  lock:.    **  1:
ee40: 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a     [WWWWW].    *
ee50: 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a  *  2:   [....W].
ee60: 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52      **  3:   [RR
ee70: 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20  RRW].    **  4: 
ee80: 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f    [RRRR.].    */
ee90: 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
eea0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
eeb0: 29 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ){..#if !defined
eec0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21  (__APPLE__) || !
eed0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
eee0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
eef0: 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46    (void)handleNF
ef00: 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  SUnlock;.      a
ef10: 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53  ssert( handleNFS
ef20: 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e  Unlock==0 );.#en
ef30: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
ef40: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
ef50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
ef60: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
ef70: 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
ef80: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
ef90: 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  nt tErrno;      
efa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
efb0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
efc0: 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
efd0: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
efe0: 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
eff0: 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
f000: 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
f010: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f020: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f030: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f040: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f050: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f060: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f070: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
f080: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f090: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f0a0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f0b0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
f0c0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
f0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
f0e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f0f0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
f100: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f110: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
f120: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f130: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
f140: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f150: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f160: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f170: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f180: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
f190: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
f1a0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f1b0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f1c0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f1d0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
f1e0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
f1f0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
f200: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f210: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
f220: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
f230: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f240: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
f250: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
f260: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
f270: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f280: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
f290: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
f2a0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
f2b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f2c0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
f2d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f2e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f2f0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f300: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f310: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
f320: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
f330: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f340: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f350: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f360: 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20  FIRST+divSize;. 
f370: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
f380: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d  n = SHARED_SIZE-
f390: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
f3a0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
f3b0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
f3c0: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
f3d0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
f3e0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
f3f0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f400: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
f410: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
f420: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
f430: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f440: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
f450: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f460: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f470: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f480: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
f490: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
f4a0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
f4b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f4c0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
f4d0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
f4e0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
f4f0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
f500: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
f510: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
f520: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f530: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
f540: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
f550: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
f560: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f570: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f580: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ck) ){.         
f590: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
f5a0: 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  he call to unixF
f5b0: 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74  ileLock() cannot
f5c0: 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e   fail because an
f5d0: 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  other.          
f5e0: 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  ** process is ho
f5f0: 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61  lding an incompa
f600: 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69  tible lock. If i
f610: 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20  t does, this .  
f620: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63          ** indic
f630: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74  ates that the ot
f640: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
f650: 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ot following the
f660: 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20   locking.       
f670: 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20     ** protocol. 
f680: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
f690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
f6a0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74  OERR_RDLOCK. Ret
f6b0: 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  urning.         
f6c0: 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   ** SQLITE_BUSY 
f6d0: 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68  would confuse th
f6e0: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69  e upper layer (i
f6f0: 6e 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61  n practice it ca
f700: 75 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20  uses .          
f710: 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20  ** an assert to 
f720: 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20  fail). */ .     
f730: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f740: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20  _IOERR_RDLOCK;. 
f750: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
f760: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
f770: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  o;.          got
f780: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
f790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f7a0: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
f7b0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
f7c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
f7d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f7e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f7f0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
f800: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f810: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
f820: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
f830: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
f840: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f850: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f860: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  )==0 ){.      pI
f870: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f880: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
f890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f8b0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
f8c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f8d0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f8e0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f8f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f900: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
f910: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65  OCK ){.    /* De
f920: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
f930: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
f940: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
f950: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
f960: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
f970: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
f980: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
f990: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
f9a0: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
f9b0: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
f9c0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
f9d0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
f9e0: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
f9f0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
fa00: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
fa10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
fa20: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
fa30: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
fa40: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
fa50: 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e  0L;.      if( un
fa60: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
fa70: 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20  , &lock)==0 ){. 
fa80: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
fa90: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
faa0: 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
fab0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
fac0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
fad0: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
fae0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
faf0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  rno;.        pIn
fb00: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
fb10: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
fb20: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
fb30: 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
fb40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
fb50: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
fb60: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
fb70: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
fb80: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
fb90: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
fba0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
fbb0: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
fbc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
fbd0: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
fbe0: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
fbf0: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
fc00: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
fc10: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
fc20: 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73  nLock--;.    ass
fc30: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
fc40: 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
fc50: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
fc60: 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 ){.      close
fc70: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
fc80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e  );.    }.  }..en
fc90: 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  d_unlock:.  unix
fca0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
fcb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fcc0: 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
fcd0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
fce0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fcf0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
fd00: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
fd10: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
fd20: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
fd30: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
fd40: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
fd50: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
fd60: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
fd70: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
fd80: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
fd90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
fda0: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
fdb0: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
fdc0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
fdd0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
fde0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
fdf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
fe00: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
fe10: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
fe20: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 61 73 73 65 72  leLock){.  asser
fe30: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
fe40: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
fe50: 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
fe60: 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
fe70: 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
fe80: 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
fe90: 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51  k, 0);.}..#if SQ
fea0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
feb0: 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
fec0: 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
fed0: 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
fee0: 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f  Byte);.static vo
fef0: 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
ff00: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b  (unixFile *pFd);
ff10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
ff20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
ff30: 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73 20  forms the parts 
ff40: 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69  of the "close fi
ff50: 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a  le" operation .*
ff60: 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  * common to all 
ff70: 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e  locking schemes.
ff80: 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64   It closes the d
ff90: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c  irectory and fil
ffa0: 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66  e.** handles, if
ffb0: 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c   they are valid,
ffc0: 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69   and sets all fi
ffd0: 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78  elds of the unix
ffe0: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
fff0: 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74  e to 0..**.** It
10000 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73   is *not* necess
10010 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ary to hold the 
10020 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73 20  mutex when this 
10030 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10040 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78  d,.** even on Vx
10050 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20  Works.  A mutex 
10060 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64  will be acquired
10070 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74   on VxWorks by t
10080 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c  he.** vxworksRel
10090 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75  easeFileId() rou
100a0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
100b0 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  int closeUnixFil
100c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
100d0 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
100e0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
100f0 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c 49  le*)id;.#if SQLI
10100 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
10110 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  >0.  unixUnmapfi
10120 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
10130 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  f.  if( pFile->h
10140 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73  >=0 ){.    robus
10150 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
10160 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
10170 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  _);.    pFile->h
10180 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f   = -1;.  }.#if O
10190 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
101a0 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
101b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
101c0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
101d0 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
101e0 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
101f0 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
10200 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  lName);.    }.  
10210 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65    vxworksRelease
10220 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49  FileId(pFile->pI
10230 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  d);.    pFile->p
10240 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Id = 0;.  }.#end
10250 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
10260 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
10270 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
10280 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
10290 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
102a0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
102b0 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
102c0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
102d0 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
102e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
102f0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
10300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
10310 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
10320 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
10330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10340 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10350 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
10360 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46  )id;.  verifyDbF
10370 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e  ile(pFile);.  un
10380 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
10390 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
103a0 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
103b0 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
103c0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
103d0 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
103e0 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
103f0 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
10400 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
10410 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
10420 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
10430 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
10440 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
10450 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
10460 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
10470 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
10480 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
10490 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
104a0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
104b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
104c0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
104d0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
104e0 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
104f0 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
10500 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
10510 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
10520 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
10530 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
10540 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
10550 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
10560 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
10570 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
10580 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
10590 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
105a0 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
105b0 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
105c0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
105d0 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
105e0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
105f0 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
10600 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
10610 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
10620 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
10630 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
10640 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
10650 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
10660 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
10670 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
10680 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106d0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
106e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10720 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10740 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
10750 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
10760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10770 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
10780 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
10790 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
107a0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
107b0 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
107c0 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
107d0 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
107e0 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
107f0 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
10800 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
10810 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
10820 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
10830 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
10840 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
10850 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
10860 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
10870 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
10880 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
10890 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
108a0 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
108b0 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
108c0 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
108d0 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
108e0 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
108f0 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
10900 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
10910 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
10920 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
10930 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
10940 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
10950 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
10960 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
10970 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
10980 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
10990 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
109a0 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
109b0 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
109c0 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
109d0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
109e0 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
109f0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10a00 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
10a10 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
10a20 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
10a30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
10a40 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
10a50 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10a60 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
10a70 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10a80 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
10a90 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
10aa0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
10ab0 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
10ac0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
10ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
10ae0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
10af0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10b00 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
10b10 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
10b20 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
10b30 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
10b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10b50 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
10b60 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
10b70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10b80 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
10b90 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
10ba0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
10bb0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
10bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
10be0 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
10bf0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
10c00 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
10c10 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
10c20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
10c30 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
10c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10c50 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
10c60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c80 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cd0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
10ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d20 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d40 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
10d50 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d70 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
10d80 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
10d90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10da0 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e  uses the existen
10db0 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
10dc0 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65  ock.** files (re
10dd0 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
10de0 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  ) to control acc
10df0 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
10e00 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
10e10 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75  .** on just abou
10e20 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
10e30 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
10e40 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
10e50 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
10e60 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
10e70 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
10e80 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
10e90 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
10ea0 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
10eb0 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
10ec0 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
10ed0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
10ee0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
10ef0 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
10f00 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
10f10 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
10f20 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
10f30 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
10f40 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
10f50 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
10f60 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
10f70 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
10f80 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
10f90 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
10fa0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
10fb0 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
10fc0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
10fd0 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
10fe0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
10ff0 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
11000 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75  by creating a su
11010 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68  bdirectory in th
11020 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
11030 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   as.** the datab
11040 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
11050 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
11060 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
11070 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
11080 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20  * The existence 
11090 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74  of a lock direct
110a0 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ory implies an E
110b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
110c0 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63  All other.** loc
110d0 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  k types (SHARED,
110e0 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
110f0 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
11100 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
11110 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
11120 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
11130 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
11140 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
11150 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
11160 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  ** lock director
11170 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  y..*/.#define DO
11180 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
11190 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
111a0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
111b0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
111c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
111d0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
111e0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
111f0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
11200 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
11210 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
11220 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
11230 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
11240 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
11250 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
11260 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
11270 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
11280 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
11290 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
112a0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
112b0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
112c0 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
112d0 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
112e0 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
112f0 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
11300 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
11310 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
11320 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
11330 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
11340 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
11350 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
11360 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
11370 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
11380 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
11390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
113a0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
113b0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
113c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
113d0 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
113e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
113f0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
11400 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
11410 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11420 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
11430 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
11440 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
11450 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
11460 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
11470 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
11480 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
11490 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
114a0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
114b0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
114c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
114d0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
114e0 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
114f0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
11500 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
11510 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
11520 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
11530 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
11540 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
11550 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
11560 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
11570 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
11580 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
11590 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
115a0 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
115b0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
115c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
115d0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
115e0 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
115f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
11600 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
11610 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
11620 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
11630 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
11640 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
11650 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
11660 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
11670 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
11680 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
11690 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
116a0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
116b0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
116c0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
116d0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
116e0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
116f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
11700 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
11710 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
11720 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
11730 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
11740 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
11750 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
11760 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
11770 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
11780 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
11790 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
117a0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
117b0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
117c0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
117d0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
117e0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
117f0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
11800 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
11810 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
11820 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
11830 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
11840 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
11850 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
11860 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
11870 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
11880 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
11890 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
118a0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
118b0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
118c0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
118d0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
118e0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
118f0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11900 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11910 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
11920 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11930 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
11940 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
11950 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11960 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
11970 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
11980 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
11990 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
119a0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
119b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
119c0 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
119d0 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
119e0 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
119f0 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
11a00 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
11a10 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
11a20 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
11a30 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
11a40 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
11a50 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
11a60 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11a70 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
11a80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11a90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
11aa0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
11ab0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
11ac0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11ad0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11ae0 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
11af0 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
11b00 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
11b10 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
11b20 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
11b30 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
11b40 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
11b50 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
11b60 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
11b70 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11b80 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
11b90 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
11ba0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11bb0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
11bc0 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
11bd0 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
11be0 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
11bf0 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
11c00 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
11c10 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
11c20 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
11c30 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
11c40 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
11c50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11c60 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
11c70 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
11c80 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69  */.  rc = osMkdi
11c90 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37  r(zLockFile, 077
11ca0 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  7);.  if( rc<0 )
11cb0 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
11cc0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
11cd0 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  he lock director
11ce0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  y */.    int tEr
11cf0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
11d00 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
11d10 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
11d20 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
11d30 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11d50 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11d60 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11d70 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
11d80 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
11d90 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
11da0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11db0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
11dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11dd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11de0 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
11df0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11e00 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
11e10 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
11e20 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11e40 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
11e50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
11e60 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
11e70 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
11e80 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
11e90 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
11ea0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
11eb0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
11ec0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
11ed0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
11ee0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
11ef0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
11f00 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
11f10 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
11f20 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
11f30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
11f40 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
11f50 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
11f60 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
11f70 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
11f80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11f90 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
11fa0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11fb0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
11fc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11fd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11fe0 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
11ff0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
12000 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12010 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
12020 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12030 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
12040 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
12050 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
12060 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12070 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
12080 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12090 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
120a0 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
120b0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
120c0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
120d0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
120e0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
120f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12100 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
12110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12120 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
12130 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
12140 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
12150 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
12160 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
12170 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
12180 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
12190 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
121a0 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
121b0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
121c0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
121d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
121e0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
121f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12200 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
12210 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
12220 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
12230 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
12240 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
12250 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
12260 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
12270 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
12280 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
12290 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
122a0 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
122b0 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
122c0 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
122d0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
122e0 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
122f0 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
12300 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
12310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12320 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RR_UNLOCK;.    }
12330 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
12340 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
12350 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12360 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
12370 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12380 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
12390 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
123a0 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
123b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
123c0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
123d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
123e0 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
123f0 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
12400 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
12410 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
12420 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12430 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
12440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12450 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
12460 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12470 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
12480 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
12490 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
124a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
124b0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
124c0 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
124d0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
124e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
124f0 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}./*********
12500 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
12510 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
12520 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12530 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
12540 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
12550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12590 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
12610 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
12620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12630 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
12640 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
12650 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
12660 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
12670 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
12680 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
12690 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
126a0 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
126b0 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
126c0 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
126d0 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
126e0 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
126f0 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
12700 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12710 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12720 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
12730 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
12740 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
12750 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
12760 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
12770 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
12780 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
12790 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
127a0 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
127b0 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
127c0 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
127d0 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
127e0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
127f0 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
12800 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
12810 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
12820 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12830 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20  E is turned off 
12840 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69  or if.** compili
12850 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a  ng for VXWORKS..
12860 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
12870 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12880 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
12890 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  S../*.** Retry f
128a0 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61  lock() calls tha
128b0 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54  t fail with EINT
128c0 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
128d0 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
128e0 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64  ust_flock(int fd
128f0 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  , int op){.  int
12900 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
12910 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77  flock(fd,op); }w
12920 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
12930 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
12940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
12950 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
12960 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c  st_flock(a,b) fl
12970 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a  ock(a,b).#endif.
12980 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69       ../*.** Thi
12990 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
129a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
129b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
129c0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
129d0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
129e0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
129f0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
12a00 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
12a10 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
12a20 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
12a30 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
12a40 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
12a50 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
12a60 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
12a70 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
12a80 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
12a90 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12aa0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
12ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ac0 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  flockCheckReserv
12ad0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12ae0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
12af0 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
12b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12b10 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
12b20 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
12b30 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12b40 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
12b50 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
12b60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
12b70 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12b80 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
12b90 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20  ( pFile );.  .  
12ba0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
12bb0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
12bc0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
12bd0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
12be0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12bf0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
12c00 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
12c10 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
12c20 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
12c30 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
12c40 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
12c50 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
12c60 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74  {.    /* attempt
12c70 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
12c80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
12c90 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
12ca0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
12cb0 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20   | LOCK_NB);.   
12cc0 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20   if( !lrc ){.   
12cd0 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f     /* got the lo
12ce0 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f  ck, unlock it */
12cf0 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62  .      lrc = rob
12d00 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
12d10 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
12d20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b      if ( lrc ) {
12d30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
12d40 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12d50 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66       /* unlock f
12d60 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72  ailed with an er
12d70 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c  ror */.        l
12d80 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12d90 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20  R_UNLOCK; .     
12da0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12db0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12dc0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12dd0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12de0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
12df0 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
12e00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
12e10 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
12e20 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12e30 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
12e40 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
12e50 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
12e60 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
12e70 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
12e80 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12e90 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12ea0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
12eb0 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
12ec0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
12ed0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
12ee0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12ef0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
12f00 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
12f10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
12f20 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
12f30 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
12f40 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
12f50 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
12f60 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
12f70 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12f80 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
12f90 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
12fa0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
12fb0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
12fc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12fd0 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
12fe0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12ff0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13000 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13010 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
13020 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
13030 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
13040 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
13050 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
13060 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
13070 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
13080 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
13090 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
130a0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
130b0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
130c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
130d0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
130e0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
130f0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
13100 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
13110 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
13120 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
13130 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
13140 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
13150 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
13160 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
13170 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
13180 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
13190 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
131a0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
131b0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
131c0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
131d0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
131e0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
131f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
13200 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
13210 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
13220 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
13230 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
13240 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
13250 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
13260 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
13270 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
13280 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
13290 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
132a0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
132b0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
132c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
132d0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
132e0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
132f0 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
13300 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
13310 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
13320 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
13330 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
13340 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
13350 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
13360 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
13370 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
13380 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
13390 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
133a0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
133b0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
133c0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
133d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
133e0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
133f0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13400 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
13410 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
13420 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
13430 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
13440 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
13450 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
13460 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13470 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13480 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13490 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
134a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
134b0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
134c0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
134d0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
134e0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
134f0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
13500 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
13510 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
13520 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
13530 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
13540 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
13550 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
13560 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13570 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13590 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
135a0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
135b0 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
135c0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
135d0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
135e0 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
135f0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
13600 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
13610 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
13620 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
13630 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13640 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13650 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13660 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
13670 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13680 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
13690 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
136a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ;.    }.  } else
136b0 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74   {.    /* got it
136c0 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
136d0 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
136e0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
136f0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
13700 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
13710 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
13720 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %s (flock)\n", p
13730 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
13740 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
13750 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
13760 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
13770 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23   : "failed"));.#
13780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13790 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
137a0 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
137b0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
137c0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
137d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
137e0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e  TE_BUSY;.  }.#en
137f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13800 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13810 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75  ERRORS */.  retu
13820 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13830 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
13840 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
13850 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
13860 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
13870 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
13880 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13890 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
138a0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
138b0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
138c0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
138d0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
138e0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
138f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13900 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13910 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13920 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
13930 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b   int flockUnlock
13940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13950 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
13960 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
13970 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13980 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
13990 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
139a0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
139b0 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
139c0 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d=%d (flock)\n",
139d0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
139e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
139f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13a00 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
13a10 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13a20 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13a30 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
13a40 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
13a50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13a60 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
13a70 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
13a80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13a90 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13aa0 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
13ab0 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
13ac0 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
13ad0 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
13ae0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
13af0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
13b00 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13b10 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
13b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13b30 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
13b40 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
13b50 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f    if( robust_flo
13b60 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
13b70 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20  K_UN) ){.#ifdef 
13b80 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13b90 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
13ba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13bb0 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_OK;.#endif /* 
13bc0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13bd0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
13be0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
13bf0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13c00 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
13c10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13c20 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
13c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13c40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
13c50 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
13c60 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13c70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13c80 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
13c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13ca0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
13cb0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
13cc0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63  NO_LOCK);.    rc
13cd0 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13ce0 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
13cf0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
13d00 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13d10 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
13d20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
13d30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13d40 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
13d50 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
13d60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d80 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dd0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e20 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
13e40 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
13e50 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
13e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e70 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
13e80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
13e90 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
13ea0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
13eb0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13ec0 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
13ed0 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
13ee0 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
13ef0 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
13f00 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
13f10 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
13f20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
13f30 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
13f40 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
13f50 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
13f60 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
13f70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
13f80 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
13f90 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
13fa0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
13fb0 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
13fc0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
13fd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13fe0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13ff0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14000 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14010 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
14020 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14030 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
14040 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14050 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
14060 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
14070 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
14080 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
14090 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
140a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
140b0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
140c0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
140d0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
140e0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
140f0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
14100 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65  int semCheckRese
14110 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14120 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
14130 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
14140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14150 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
14160 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
14170 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14180 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
14190 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
141a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
141b0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
141c0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
141d0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
141e0 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
141f0 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
14200 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
14210 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
14220 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
14230 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
14240 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
14250 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
14260 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
14270 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
14280 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
14290 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
142a0 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
142b0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
142c0 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75  ->pSem;.    stru
142d0 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
142e0 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72  ..    if( sem_tr
142f0 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
14300 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
14310 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14320 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d     if( EAGAIN !=
14330 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
14340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
14350 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
14360 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
14370 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
14380 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RVEDLOCK);.     
14390 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
143a0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
143b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
143c0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
143d0 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
143e0 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
143f0 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
14400 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
14410 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14420 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
14430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14440 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
14450 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
14460 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
14470 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
14480 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
14490 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
144a0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
144b0 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
144c0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
144d0 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
144e0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
144f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14500 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
14510 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
14520 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
14530 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
14540 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
14550 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
14560 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
14570 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
14580 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
14590 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
145a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
145b0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
145c0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
145d0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
145e0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
145f0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14600 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14610 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14620 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14630 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14640 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14650 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14660 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14670 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14680 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14690 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
146a0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
146b0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
146c0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
146d0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
146e0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
146f0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14700 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14710 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14720 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14730 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14740 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14750 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14760 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14770 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14780 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14790 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
147a0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
147b0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
147c0 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
147d0 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
147e0 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
147f0 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
14800 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
14810 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
14820 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
14830 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
14840 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
14850 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
14860 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
14870 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
14880 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
14890 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
148a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
148b0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
148c0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
148d0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
148e0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
148f0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14900 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14910 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14920 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33   semLock(sqlite3
14930 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
14940 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
14950 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14960 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
14970 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74   int fd;.  sem_t
14980 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14990 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
149a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
149b0 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
149c0 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
149d0 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
149e0 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
149f0 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
14a00 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
14a10 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
14a20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14a30 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
14a40 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14a50 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
14a60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14a70 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
14a80 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
14a90 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
14aa0 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
14ab0 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
14ac0 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
14ad0 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
14ae0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
14af0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14b00 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
14b10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
14b20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
14b30 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
14b40 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
14b50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14b60 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
14b70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
14b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14b90 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
14ba0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
14bb0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
14bc0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
14bd0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
14be0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
14bf0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
14c00 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
14c10 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14c20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
14c30 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
14c40 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
14c50 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
14c60 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
14c70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14c80 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14c90 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73   int semUnlock(s
14ca0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14cb0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
14cc0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
14cd0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14ce0 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
14cf0 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
14d00 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  de->pSem;..  ass
14d10 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14d20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
14d30 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
14d40 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
14d50 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22   pid=%d (sem)\n"
14d60 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
14d70 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
14d80 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14d90 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
14da0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
14db0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
14dc0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
14dd0 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
14de0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14df0 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
14e00 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
14e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14e20 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
14e30 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
14e40 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
14e50 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
14e60 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
14e70 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
14e80 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
14e90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14ea0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
14eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14ec0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
14ed0 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  ally unlock. */.
14ee0 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28    if ( sem_post(
14ef0 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20  pSem)==-1 ) {.  
14f00 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f    int rc, tErrno
14f10 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
14f20 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
14f30 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
14f40 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
14f50 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  R_UNLOCK);.    i
14f60 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
14f70 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
14f80 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14f90 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
14fa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
14fb0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
14fc0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
14fd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14fe0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
14ff0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
15000 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
15010 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
15020 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
15030 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
15040 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15050 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
15060 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
15070 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
15080 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
15090 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
150a0 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
150b0 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
150c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
150d0 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
150e0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
150f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15100 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
15110 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
15120 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
15130 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
15140 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
15150 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
15160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
15170 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
15180 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
15190 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
151a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
151b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
15200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
15250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
15270 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
15280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
152a0 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
152b0 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
152c0 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
152d0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
152e0 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
152f0 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
15300 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
15310 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
15320 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
15330 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
15340 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
15350 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
15360 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
15370 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
15380 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
15390 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
153a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
153b0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
153c0 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
153d0 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
153e0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
153f0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
15400 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
15410 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
15420 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
15430 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
15440 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
15450 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
15460 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
15470 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
15480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15490 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
154a0 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
154b0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
154c0 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
154d0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
154e0 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
154f0 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
15500 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
15510 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
15520 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
15530 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
15540 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
15550 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
15560 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
15570 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
15580 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
15590 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
155a0 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
155b0 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
155c0 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
155d0 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
155e0 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
155f0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
15600 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
15610 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
15620 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
15650 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
15660 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
15670 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
15680 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
15690 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
156a0 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
156b0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
156c0 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
156d0 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
156e0 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
156f0 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
15700 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
15710 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
15720 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
15730 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
15740 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
15750 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
15760 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
15770 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
15780 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
15790 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
157a0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
157b0 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
157c0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
157d0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
157e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
157f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15800 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
15810 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15820 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
15830 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
15840 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
15850 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15860 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
15870 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
15880 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
15890 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
158a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
158b0 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
158c0 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
158d0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
158e0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
158f0 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
15900 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
15910 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
15920 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
15930 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
15940 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
15950 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
15960 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
15970 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
15980 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
15990 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
159a0 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
159b0 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
159c0 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
159d0 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
159e0 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
159f0 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
15a00 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
15a10 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
15a20 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
15a30 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
15a40 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
15a50 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
15a60 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
15a70 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
15a80 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
15a90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
15aa0 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
15ab0 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
15ac0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
15ad0 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
15ae0 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
15af0 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
15b00 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
15b10 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
15b20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15b30 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
15b40 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
15b50 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
15b60 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15b70 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
15b80 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
15b90 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
15ba0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
15bb0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15bc0 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
15bd0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
15be0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15bf0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
15c00 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15c10 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
15c20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15c30 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
15c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15c50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
15c60 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
15c70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
15c80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
15c90 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
15ca0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
15cb0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
15cc0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
15cd0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
15ce0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
15cf0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
15d00 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
15d10 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
15d20 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
15d30 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
15d40 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
15d50 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
15d60 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15d70 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
15d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15d90 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
15da0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
15db0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
15dc0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
15dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
15de0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
15df0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15e00 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15e10 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
15e20 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
15e30 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
15e40 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
15e50 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
15e60 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15e70 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15e80 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
15e90 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
15ea0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
15eb0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
15ec0 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
15ed0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
15ee0 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
15ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f00 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
15f10 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
15f20 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
15f30 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
15f40 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
15f50 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
15f60 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
15f70 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
15f80 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
15f90 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
15fa0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
15fb0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
15fc0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
15fd0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
15fe0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
15ff0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
16000 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
16010 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
16020 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
16030 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
16040 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
16050 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16060 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16070 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
16080 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
16090 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
160a0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
160b0 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
160c0 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
160d0 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
160e0 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
160f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
16100 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
16110 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
16120 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16130 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
16140 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
16150 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
16160 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
16170 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
16180 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
16190 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
161a0 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
161b0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
161c0 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
161d0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
161e0 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
161f0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
16200 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
16210 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
16220 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
16230 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
16240 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
16250 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
16260 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
16270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16280 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
16290 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
162a0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
162b0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
162c0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
162d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
162e0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
162f0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
16300 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
16310 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
16320 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
16330 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
16340 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
16350 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
16360 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
16370 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
16380 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
16390 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
163a0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
163b0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
163c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
163d0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
163e0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
163f0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
16400 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
16410 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
16420 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
16430 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
16440 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
16450 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
16460 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
16470 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
16480 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
16490 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
164a0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
164b0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
164c0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
164d0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
164e0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
164f0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
16500 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
16510 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
16520 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
16530 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
16540 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
16550 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
16560 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
16570 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
16580 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
16590 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
165a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
165b0 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
165c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
165d0 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
165e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
165f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16600 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16610 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
16620 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
16630 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
16640 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16650 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
16660 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
16670 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
16680 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
16690 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
166a0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
166b0 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
166c0 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
166d0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
166e0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
166f0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16700 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
16710 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
16720 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16730 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
16740 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
16750 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70  ->nShared , getp
16760 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  id()));..  /* If
16770 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
16780 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
16790 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
167a0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
167b0 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
167c0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
167d0 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
167e0 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
167f0 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
16800 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
16810 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
16820 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
16830 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
16840 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
16850 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
16860 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
16870 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
16880 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
16890 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
168a0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
168b0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
168c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
168d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
168e0 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
168f0 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
16900 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
16910 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
16920 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
16930 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
16940 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
16950 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
16960 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
16970 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
16980 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
16990 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
169a0 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
169b0 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
169c0 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
169d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
169e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
169f0 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
16a00 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16a10 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
16a20 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
16a30 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16a40 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
16a50 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
16a60 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
16a70 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16a80 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
16a90 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
16aa0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
16ab0 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
16ac0 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
16ad0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16ae0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
16af0 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
16b00 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
16b10 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
16b20 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
16b30 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
16b40 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
16b50 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
16b60 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
16b70 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
16b80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
16b90 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
16ba0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16bb0 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
16bc0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
16bd0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
16be0 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
16bf0 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
16c00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16c10 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
16c20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
16c30 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
16c40 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
16c50 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
16c60 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
16c70 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
16c80 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
16c90 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
16ca0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
16cb0 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
16cc0 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
16cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
16ce0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16cf0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16d00 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
16d10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
16d20 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
16d30 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
16d40 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
16d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
16d60 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16d70 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
16d80 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
16d90 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
16da0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16db0 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
16dc0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16dd0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16de0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
16df0 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
16e00 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
16e10 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
16e20 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
16e30 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
16e40 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
16e50 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
16e60 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
16e70 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
16e80 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
16e90 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
16ea0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
16eb0 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
16ec0 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
16ed0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16ee0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16ef0 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
16f00 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16f10 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
16f20 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
16f30 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
16f40 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
16f50 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
16f60 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16f70 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
16f80 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
16f90 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
16fa0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
16fb0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
16fc0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
16fe0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
16ff0 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
17000 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
17010 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
17020 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
17030 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
17040 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
17050 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
17060 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
17070 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
17080 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
17090 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
170a0 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
170b0 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
170c0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
170d0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
170e0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
170f0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
17100 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
17110 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
17120 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
17130 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
17140 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
17150 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
17160 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
17170 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
17180 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
17190 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
171a0 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
171b0 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
171c0 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
171d0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
171e0 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
171f0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
17200 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
17210 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17220 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17230 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
17240 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
17250 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
17260 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
17270 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
17280 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
17290 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
172a0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
172b0 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
172c0 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
172d0 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
172e0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
172f0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17300 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
17310 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
17320 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
17330 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
17340 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
17350 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f  rrno = lrc1Errno
17360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
17370 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
17380 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17390 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
173a0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
173b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
173c0 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
173d0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
173e0 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
173f0 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
17400 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
17410 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
17420 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
17430 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
17440 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
17450 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
17460 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
17470 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
17480 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
17490 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
174a0 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
174b0 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
174c0 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
174d0 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
174e0 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
174f0 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
17500 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
17510 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
17520 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
17530 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
17540 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
17560 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
17570 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
17580 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17590 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
175a0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
175b0 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
175c0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
175d0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
175e0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
175f0 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
17600 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
17610 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
17620 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
17630 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
17640 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
17650 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
17660 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
17670 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
17680 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
17690 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
176a0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
176b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
176c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
176d0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
176e0 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
176f0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
17700 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
17710 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
17720 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
17730 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
17740 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
17750 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
17760 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
17770 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
17780 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
17790 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
177a0 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
177b0 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
177c0 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
177d0 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
177e0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
177f0 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
17800 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
17810 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17820 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
17830 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17840 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17850 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
17860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17870 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
17880 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17890 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
178a0 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
178b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
178c0 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
178d0 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
178e0 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
178f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
17900 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
17910 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17920 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
17930 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
17960 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
17970 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
17980 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
17990 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
179a0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
179d0 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
179e0 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
179f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
17a00 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
17a10 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
17a20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
17a30 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
17a40 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
17a50 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
17a60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17a70 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
17a80 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
17a90 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
17aa0 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
17ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ac0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
17ad0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
17ae0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
17af0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
17b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17b10 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
17b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17b30 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
17b40 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
17b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
17b60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17b70 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
17b80 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
17b90 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
17ba0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
17bb0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
17bc0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
17bd0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
17be0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
17bf0 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
17c00 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
17c10 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17c20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
17c30 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
17c40 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
17c50 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
17c60 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
17c70 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
17c80 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
17c90 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
17ca0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
17cb0 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
17cc0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
17cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17ce0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
17cf0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
17d00 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
17d10 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
17d20 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
17d30 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
17d40 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
17d50 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
17d60 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17d70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
17d80 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
17d90 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
17da0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
17db0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
17dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17dd0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
17de0 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
17df0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17e00 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
17e10 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
17e20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
17e30 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17e40 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
17e50 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
17e60 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
17e70 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
17e80 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
17e90 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
17ea0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
17eb0 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
17ec0 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
17ed0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
17ee0 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
17ef0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
17f00 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
17f10 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
17f20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
17f30 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
17f40 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
17f50 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
17f60 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17f70 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
17f80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
17f90 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
17fa0 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
17fb0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
17fc0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
17fd0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
17fe0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
17ff0 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
18000 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
18010 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18020 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
18030 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
18040 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
18050 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
18060 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
18070 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18080 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
18090 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
180a0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
180b0 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
180c0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
180d0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
180e0 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
180f0 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
18100 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
18110 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
18120 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
18130 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
18140 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
18150 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
18160 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
18170 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
18180 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
18190 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
181a0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
181b0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
181c0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
181d0 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
181e0 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
181f0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
18200 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
18210 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18220 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
18230 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
18240 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
18250 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
18260 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
18270 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
18280 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
18290 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
182a0 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
182b0 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
182c0 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
182d0 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
182e0 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
182f0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
18300 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
18310 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18320 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
18330 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
18340 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
18350 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18360 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
18370 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
18380 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
18390 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
183a0 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
183b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
183c0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
183d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
183e0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
183f0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18400 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
18410 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
18420 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18430 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
18440 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
18450 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
18460 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
18470 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
18480 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
18490 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
184a0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
184b0 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
184c0 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
184d0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
184e0 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
184f0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
18500 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18510 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
18520 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
18530 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
18540 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
18550 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18560 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
18580 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
18590 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
185a0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
185b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
185c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
185d0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
185e0 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
185f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18600 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18610 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
18620 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
18630 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
18640 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
18650 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18660 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
18670 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
18680 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
18690 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
186a0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
186b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
186c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
186d0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
186e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
186f0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18700 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
18710 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
18720 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
18730 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
18740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
18750 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
18760 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
18770 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
18780 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
18790 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
187a0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
187b0 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
187c0 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
187d0 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
187e0 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
187f0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
18800 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
18810 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
18820 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
18830 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
18840 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
18850 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
18860 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
18870 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
18880 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
18890 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
188a0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
188b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
188c0 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
188d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
188e0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
188f0 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
18900 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
18910 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18920 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18930 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
18940 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
18950 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
18960 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
18970 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
18980 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
18990 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
189a0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
189b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
189c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
189d0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
189e0 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
189f0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
18a00 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
18a10 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
18a20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
18a30 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
18a40 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
18a50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
18a60 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18a70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18a80 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
18a90 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
18aa0 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
18ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
18ac0 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
18ad0 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
18ae0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
18af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
18b00 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
18b10 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
18b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18b30 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
18b40 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
18b50 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
18b60 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28  ;.    afpUnlock(
18b70 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
18b80 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
18b90 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
18ba0 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69  e->pInode && pFi
18bb0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
18bc0 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
18bd0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
18be0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
18bf0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
18c00 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
18c10 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
18c20 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
18c30 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
18c40 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
18c50 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
18c60 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
18c70 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64  to pInode->aPend
18c80 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
18c90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
18ca0 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20  losed when.     
18cb0 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
18cc0 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
18cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
18ce0 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
18cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
18d00 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
18d10 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
18d20 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
18d30 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
18d40 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
18d50 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
18d60 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
18d70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18d80 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
18d90 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18da0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
18db0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
18dc0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
18dd0 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
18de0 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
18df0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
18e00 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
18e10 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
18e20 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
18e30 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
18e40 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
18e50 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
18e60 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
18e70 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
18e80 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
18e90 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
18ea0 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
18eb0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
18ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
18ed0 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
18ee0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18ef0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18f00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
18f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f50 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
18f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fa0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fc0 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
18fd0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ff0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
19000 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
19010 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
19020 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
19030 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
19040 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
19050 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
19060 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
19070 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
19080 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
19090 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
190a0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
190b0 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
190c0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
190d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
190e0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
190f0 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
19100 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
19110 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
19120 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
19130 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
19140 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
19150 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
19160 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
19170 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
19180 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
19190 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
191a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
191b0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
191c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
191d0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
191e0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
191f0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
19200 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
19210 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
19220 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
19230 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
19240 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
19250 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
19260 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
19270 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
19280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19290 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
192a0 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
192b0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
192c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
192d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
19320 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
19330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
19390 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
193a0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
193c0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
193d0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
193e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
193f0 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
19400 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
19410 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
19420 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
19430 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
19440 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
19450 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
19460 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
19470 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
19480 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
19490 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
194a0 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
194b0 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
194c0 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
194d0 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
194e0 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
194f0 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
19500 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
19510 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
19520 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
19530 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
19540 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
19550 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
19560 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19570 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
19580 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
19590 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
195a0 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
195b0 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
195c0 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
195d0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
195e0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
195f0 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
19600 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
19610 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
19620 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
19630 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
19640 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
19650 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
19660 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
19670 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
19680 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
19690 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
196a0 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
196b0 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
196c0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
196d0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
196e0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
196f0 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
19700 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
19710 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
19720 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
19730 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
19740 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
19750 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
19760 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
19770 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
19780 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20  ot;.  int prior 
19790 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e  = 0;.#if (!defin
197a0 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26  ed(USE_PREAD) &&
197b0 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52   !defined(USE_PR
197c0 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65  EAD64)).  i64 ne
197d0 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a  wOffset;.#endif.
197e0 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20    TIMER_START;. 
197f0 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63   assert( cnt==(c
19800 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20  nt&0x1ffff) );. 
19810 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32   assert( id->h>2
19820 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31   );.  cnt &= 0x1
19830 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66 20  ffff;.  do{.#if 
19840 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19850 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50  D).    got = osP
19860 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
19870 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
19880 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19890 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
198a0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
198b0 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20  SE_PREAD64).    
198c0 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28  got = osPread64(
198d0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
198e0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
198f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19900 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73  got = -1 );.#els
19910 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20  e.    newOffset 
19920 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
19930 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
19940 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
19950 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74  Error( newOffset
19960 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  -- );.    if( ne
19970 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
19980 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  ){.      if( new
19990 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a  Offset == -1 ){.
199a0 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69          ((unixFi
199b0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
199c0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
199d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
199e0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
199f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
19a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19a10 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
19a20 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64      got = osRead
19a30 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19a40 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  t);.#endif.    i
19a50 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72  f( got==cnt ) br
19a60 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74  eak;.    if( got
19a70 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
19a80 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20  errno==EINTR ){ 
19a90 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75  got = 1; continu
19aa0 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72  e; }.      prior
19ab0 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 28 75 6e   = 0;.      ((un
19ac0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
19ad0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
19ae0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19af0 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30   }else if( got>0
19b00 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d   ){.      cnt -=
19b10 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73   got;.      offs
19b20 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  et += got;.     
19b30 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20   prior += got;. 
19b40 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69       pBuf = (voi
19b50 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a  d*)(got + (char*
19b60 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  )pBuf);.    }.  
19b70 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b  }while( got>0 );
19b80 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
19b90 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20  OSTRACE(("READ  
19ba0 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
19bb0 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20   %llu\n",.      
19bc0 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74        id->h, got
19bd0 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70  +prior, offset-p
19be0 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50  rior, TIMER_ELAP
19bf0 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  SED));.  return 
19c00 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a  got+prior;.}../*
19c10 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
19c20 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
19c30 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
19c40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
19c50 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
19c60 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
19c70 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
19c80 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
19c90 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
19ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
19cb0 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
19cc0 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69  file *id, .  voi
19cd0 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
19ce0 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
19cf0 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20  nt64 offset.){. 
19d00 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
19d10 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
19d20 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  d;.  int got;.  
19d30 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
19d40 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
19d50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
19d60 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
19d70 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
19d80 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
19d90 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
19da0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
19db0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
19dc0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
19dd0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
19de0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
19df0 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
19e00 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
19e10 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
19e20 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
19e30 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
19e40 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
19e50 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
19e60 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
19e70 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
19e80 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
19e90 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
19ea0 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72  s much of this r
19eb0 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70  ead request as p
19ec0 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
19ed0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
19ee0 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
19ef0 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
19f00 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
19f10 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
19f20 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
19f30 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
19f40 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
19f50 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
19f60 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
19f70 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
19f80 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61  ion))[offset], a
19f90 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
19fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
19fc0 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d  t nCopy = pFile-
19fd0 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
19fe0 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  et;.      memcpy
19ff0 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
1a000 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1a010 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f  n))[offset], nCo
1a020 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
1a030 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
1a040 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
1a050 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
1a060 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
1a070 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
1a080 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
1a090 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1a0a0 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
1a0b0 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
1a0c0 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
1a0d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
1a0e0 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
1a0f0 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
1a100 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1a110 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
1a120 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a130 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
1a140 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a150 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
1a160 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1a170 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
1a180 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
1a190 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
1a1a0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
1a1b0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
1a1c0 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
1a1d0 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
1a1e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a1f0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1a200 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1a210 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c   to seek the fil
1a220 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61 73  e-descriptor pas
1a230 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1a240 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
1a250 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20  absolute offset 
1a260 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d  iOff, then attem
1a270 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66  pt to write nBuf
1a280 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1a290 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69  rom.** pBuf to i
1a2a0 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1a2b0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31  ccurs, return -1
1a2c0 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e   and set *piErrn
1a2d0 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  o. Otherwise, .*
1a2e0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63 74  * return the act
1a2f0 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
1a300 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68 69  tes written (whi
1a310 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74  ch may be less t
1a320 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f  han.** nBuf)..*/
1a330 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1a340 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e  AndWriteFd(.  in
1a350 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  t fd,           
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a370 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1a380 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1a390 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20    i64 iOff,     
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74    /* File offset
1a3c0 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
1a3d0 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  g at */.  const 
1a3e0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
1a3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
1a400 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  y data from this
1a410 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20 66   buffer to the f
1a420 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  ile */.  int nBu
1a430 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a440 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a450 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66 20   of buffer pBuf 
1a460 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
1a470 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20  t *piErrno      
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a490 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62   OUT: Error numb
1a4a0 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75  er if error occu
1a4b0 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  rs */.){.  int r
1a4c0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1a4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a4e0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a4f0 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a  system call */..
1a500 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d    assert( nBuf==
1a510 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20 29  (nBuf&0x1ffff) )
1a520 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 32  ;.  assert( fd>2
1a530 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78   );.  nBuf &= 0x
1a540 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
1a550 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e  TART;..#if defin
1a560 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
1a570 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74  do{ rc = osPwrit
1a580 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1a590 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28  , iOff); }while(
1a5a0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a5b0 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
1a5c0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a5d0 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  64).  do{ rc = o
1a5e0 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1a5f0 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1a600 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1a610 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1a620 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1a630 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1a640 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1a650 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1a660 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1a670 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  -- );..    if( i
1a680 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20  Seek!=iOff ){.  
1a690 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20      if( piErrno 
1a6a0 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53  ) *piErrno = (iS
1a6b0 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20  eek==-1 ? errno 
1a6c0 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  : 0);.      retu
1a6d0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1a6e0 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1a6f0 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1a700 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a710 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a720 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1a730 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1a740 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1a750 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a760 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1a770 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a780 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ..  if( rc<0 && 
1a790 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1a7a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65  no = errno;.  re
1a7b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1a7c0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1a7d0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
1a7e0 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
1a7f0 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
1a800 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
1a810 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a820 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
1a830 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
1a840 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
1a850 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1a860 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1a870 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
1a880 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1a890 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1a8a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1a8b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1a8c0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
1a8d0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
1a8e0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1a8f0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
1a900 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57   return seekAndW
1a910 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66  riteFd(id->h, of
1a920 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c  fset, pBuf, cnt,
1a930 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29   &id->lastErrno)
1a940 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1a950 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1a960 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1a970 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1a980 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1a990 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1a9a0 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1a9b0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1a9c0 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1a9d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a9e0 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1a9f0 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1aa00 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1aa10 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1aa20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1aa30 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1aa40 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1aa50 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1aa60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1aa70 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1aa80 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1aa90 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1aaa0 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1aab0 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1aac0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1aad0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1aae0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1aaf0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1ab00 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1ab10 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1ab20 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1ab30 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1ab40 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1ab50 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1ab60 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1ab70 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1ab80 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1ab90 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1aba0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1abb0 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1abc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1abd0 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1abe0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1abf0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1ac00 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1ac10 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1ac20 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1ac30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1ac40 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1ac50 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1ac60 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1ac70 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1ac80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ac90 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1aca0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1acb0 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1acc0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1acd0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1ace0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1acf0 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1ad00 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1ad10 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1ad20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1ad30 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1ad40 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1ad50 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1ad60 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1ad70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1ad80 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1ad90 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1ada0 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1adb0 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1adc0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1add0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1ade0 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1adf0 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1ae00 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1ae10 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1ae20 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1ae30 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1ae40 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1ae50 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1ae60 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1ae70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ae80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1ae90 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1aea0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1aeb0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1aec0 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1aed0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1aee0 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1aef0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1af00 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1af10 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1af20 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1af30 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1af40 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1af50 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1af60 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1af70 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1af80 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1af90 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1afa0 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1afb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1afc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1afd0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1afe0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1aff0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1b000 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1b010 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1b020 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1b030 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1b040 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1b050 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1b060 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1b070 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1b080 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1b090 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
1b0a0 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
1b0b0 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1b0c0 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1b0d0 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
1b0e0 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1b0f0 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1b100 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1b110 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1b120 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1b130 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b140 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1b150 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1b160 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1b170 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1b180 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
1b190 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
1b1a0 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1b1b0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1b1c0 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1b1d0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1b1e0 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1b1f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b200 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1b210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b220 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1b230 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
1b240 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1b250 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b260 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1b270 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b280 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1b290 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1b2a0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1b2b0 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1b2c0 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1b2d0 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1b2e0 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1b2f0 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1b300 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1b310 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1b320 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1b330 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1b340 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1b350 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1b360 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1b370 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1b380 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1b390 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1b3a0 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1b3b0 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1b3c0 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1b3d0 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1b3e0 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1b3f0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1b400 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1b410 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1b420 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1b430 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1b440 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1b450 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1b460 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1b470 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a  async=fdatasync.
1b480 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1b490 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66  fdatasync).# def
1b4a0 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73  ine fdatasync fs
1b4b0 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ync.#endif../*.*
1b4c0 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55  * Define HAVE_FU
1b4d0 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20  LLFSYNC to 0 or 
1b4e0 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  1 depending on w
1b4f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
1b500 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   the F_FULLFSYNC
1b510 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
1b520 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  d.  F_FULLFSYNC 
1b530 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1b540 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
1b550 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74  n Mac OS X.  But
1b560 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e   that could chan
1b570 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f  ge..*/.#ifdef F_
1b580 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69  FULLFSYNC.# defi
1b590 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b5a0 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  C 1.#else.# defi
1b5b0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b5c0 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  C 0.#endif.../*.
1b5d0 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73  ** The fsync() s
1b5e0 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20  ystem call does 
1b5f0 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65  not work as adve
1b600 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a  rtised on many.*
1b610 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20  * unix systems. 
1b620 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
1b630 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61  rocedure is an a
1b640 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a  ttempt to make.*
1b650 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72  * it work better
1b660 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1b670 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f  TE_NO_SYNC macro
1b680 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73   disables all fs
1b690 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73  ync()s.  This is
1b6a0 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74   useful.** for t
1b6b0 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77  esting when we w
1b6c0 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75  ant to run throu
1b6d0 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  gh the test suit
1b6e0 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f  e quickly..** Yo
1b6f0 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61  u are strongly a
1b700 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20  dvised *not* to 
1b710 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49  deploy with SQLI
1b720 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e  TE_NO_SYNC.** en
1b730 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20  abled, however, 
1b740 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54  since with SQLIT
1b750 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65  E_NO_SYNC enable
1b760 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a  d, an OS crash.*
1b770 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
1b780 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63  re will likely c
1b790 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62  orrupt the datab
1b7a0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1b7b0 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20  SQLite sets the 
1b7c0 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66  dataOnly flag if
1b7d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b7e0 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67   file is unchang
1b7f0 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ed..** The idea 
1b800 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20  behind dataOnly 
1b810 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  is that it shoul
1b820 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65  d only write the
1b830 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a   file content.**
1b840 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68   to disk, not th
1b850 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c  e inode.  We onl
1b860 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69  y set dataOnly i
1b870 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  f the file size 
1b880 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  is .** unchanged
1b890 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20   since the file 
1b8a0 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20  size is part of 
1b8b0 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65  the inode.  Howe
1b8c0 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27  ver, .** Ted Ts'
1b8d0 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20  o tells us that 
1b8e0 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1b8f0 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
1b900 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20  inode if the.** 
1b910 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68  file size has ch
1b920 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79  anged.  The only
1b930 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65   real difference
1b940 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79   between fdatasy
1b950 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e  nc().** and fsyn
1b960 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75  c(), Ted tells u
1b970 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61  s, is that fdata
1b980 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20  sync() will not 
1b990 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f  flush the.** ino
1b9a0 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20  de if the mtime 
1b9b0 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65  or owner or othe
1b9c0 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74  r inode attribut
1b9d0 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e  es have changed.
1b9e0 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65  .** We only care
1b9f0 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
1ba00 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74  size, not the ot
1ba10 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75  her file attribu
1ba20 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61  tes, so.** as fa
1ba30 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63  r as SQLite is c
1ba40 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61  oncerned, an fda
1ba50 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61  tasync() is alwa
1ba60 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20  ys adequate..** 
1ba70 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  So, we always us
1ba80 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66  e fdatasync() if
1ba90 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
1baa0 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a  , regardless of.
1bab0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1bac0 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1bad0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1bae0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
1baf0 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
1bb00 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
1bb10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1bb20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22   The following "
1bb30 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f  ifdef/elif/else/
1bb40 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20  " block has the 
1bb50 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61  same structure a
1bb60 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62  s.  ** the one b
1bb70 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c  elow. It is repl
1bb80 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65  icated here sole
1bb90 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74  ly to avoid clut
1bba0 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20  tering .  ** up 
1bbb0 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69  the real code wi
1bbc0 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41  th the UNUSED_PA
1bbd0 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73  RAMETER() macros
1bbe0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1bbf0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55  LITE_NO_SYNC.  U
1bc00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1bc10 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
1bc20 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1bc30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1bc40 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1bc50 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1bc60 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  FSYNC.  UNUSED_P
1bc70 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1bc80 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  y);.#else.  UNUS
1bc90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1bca0 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1bcb0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1bcc0 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nly);.#endif..  
1bcd0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
1bce0 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
1bcf0 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
1bd00 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
1bd10 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
1bd20 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
1bd30 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
1bd40 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
1bd50 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
1bd60 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
1bd70 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
1bd80 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
1bd90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1bda0 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
1bdb0 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
1bdc0 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
1bdd0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
1bde0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1bdf0 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
1be00 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
1be10 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
1be20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
1be30 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
1be40 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1be50 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
1be60 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  _OK;.#elif HAVE_
1be70 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
1be80 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
1be90 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1bea0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1beb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1bec0 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
1bed0 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
1bee0 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
1bef0 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
1bf00 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
1bf10 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
1bf20 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
1bf30 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
1bf40 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
1bf50 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
1bf60 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
1bf70 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
1bf80 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
1bf90 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
1bfa0 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
1bfb0 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
1bfc0 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
1bfd0 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
1bfe0 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
1bff0 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
1c000 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
1c010 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
1c020 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
1c030 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
1c040 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
1c050 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
1c060 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
1c070 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
1c080 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
1c090 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
1c0a0 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
1c0b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1c0c0 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
1c0d0 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
1c0e0 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
1c0f0 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
1c100 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
1c110 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
1c120 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
1c130 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
1c140 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
1c150 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
1c160 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1c170 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
1c180 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
1c190 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1c1a0 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
1c1b0 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
1c1c0 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
1c1d0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
1c1e0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1c1f0 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
1c200 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1c210 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c220 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
1c230 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
1c240 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
1c250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c260 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1c270 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1c280 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1c290 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1c2a0 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1c2b0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1c2c0 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1c2d0 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1c2e0 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1c2f0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1c300 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1c310 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1c320 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1c330 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1c340 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1c350 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1c360 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1c370 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1c380 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  ** The directory
1c390 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c3a0 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c   is used for onl
1c3b0 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f  y one thing - to
1c3c0 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69  .** fsync() a di
1c3d0 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20  rectory to make 
1c3e0 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69  sure file creati
1c3f0 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20  on and deletion 
1c400 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c  events.** are fl
1c410 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ushed to disk.  
1c420 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20  Such fsyncs are 
1c430 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65  not needed on ne
1c440 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e  wer.** journalin
1c450 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62  g filesystems, b
1c460 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ut are required 
1c470 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73  on older filesys
1c480 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
1c490 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1c4a0 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
1c4b0 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c   the xSetSysCall
1c4c0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54   interface..** T
1c4d0 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76  he ability to ov
1c4e0 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74  erride this rout
1c4f0 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e  ine was added in
1c500 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a   support of the.
1c510 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  ** chromium sand
1c520 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20  box.  Opening a 
1c530 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73  directory is a s
1c540 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65  ecurity risk (we
1c550 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f   are.** told) so
1c560 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72   making it overr
1c570 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74  ideable allows t
1c580 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  he chromium sand
1c590 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63  box to.** replac
1c5a0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1c5b0 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e  ith a harmless n
1c5c0 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74  o-op.  To make t
1c5d0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1c5e0 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20   no-op, replace 
1c5f0 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74  it with a stub t
1c600 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hat returns SQLI
1c610 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73  TE_OK but leaves
1c620 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20  .** *pFd set to 
1c630 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1c640 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  r..**.** If SQLI
1c650 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c660 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1c670 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1c680 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1c690 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1c6a0 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1c6b0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1c6c0 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1c6d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1c6e0 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1c6f0 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1c700 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1c710 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1c720 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1c730 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c740 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1c750 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1c760 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1c770 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1c780 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
1c790 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1c7a0 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1c7b0 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1c7c0 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1c7d0 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ';.    fd = robu
1c7e0 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65  st_open(zDirname
1c7f0 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1c800 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
1c810 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
1c820 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1c830 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1c840 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1c850 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1c860 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1c870 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
1c880 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1c890 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1c8a0 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
1c8b0 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  me));.}../*.** M
1c8c0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1c8d0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1c8e0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1c8f0 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1c900 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1c910 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1c920 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1c930 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1c940 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1c950 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1c960 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1c970 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1c980 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1c990 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1c9a0 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1c9b0 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1c9c0 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1c9d0 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1c9e0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1c9f0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1ca00 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1ca10 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1ca20 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1ca30 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1ca40 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1ca50 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1ca60 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1ca70 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1ca80 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1ca90 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1caa0 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1cab0 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1cac0 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1cad0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1cae0 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1caf0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1cb00 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1cb10 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1cb20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1cb30 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1cb40 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1cb50 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1cb60 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1cb70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1cb80 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1cb90 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1cba0 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1cbb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1cbc0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1cbd0 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1cbe0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1cbf0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1cc00 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1cc10 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1cc20 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1cc30 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1cc40 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1cc50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1cc60 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1cc70 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1cc80 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1cc90 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1cca0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1ccb0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1ccc0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1ccd0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1cce0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1ccf0 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1cd00 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1cd10 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1cd20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1cd30 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1cd40 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1cd50 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1cd60 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1cd70 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1cd80 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1cd90 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1cda0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1cdb0 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1cdc0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1cdd0 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1cde0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1cdf0 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1ce00 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1ce10 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1ce20 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1ce30 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1ce40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1ce50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1ce60 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1ce70 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1ce80 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ce90 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1cea0 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1ceb0 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1cec0 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1ced0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1cee0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1cef0 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1cf00 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1cf10 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1cf20 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1cf30 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1cf40 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1cf50 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1cf60 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1cf70 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1cf80 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1cf90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1cfa0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1cfb0 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1cfc0 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1cfd0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1cfe0 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1cff0 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1d000 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1d010 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1d020 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1d030 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1d040 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1d050 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1d060 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1d070 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1d080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d090 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1d0a0 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1d0b0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1d0c0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1d0d0 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1d0e0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1d0f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d100 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
1d110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1d130 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1d140 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1d150 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1d160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1d170 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1d180 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1d190 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1d1a0 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1d1b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1d1c0 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1d1d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1d1e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1d1f0 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1d200 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1d210 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1d220 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1d230 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1d240 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1d250 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1d260 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1d270 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1d280 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1d290 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1d2a0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1d2b0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1d2c0 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1d2d0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1d2e0 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1d2f0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1d300 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1d310 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1d320 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1d330 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1d340 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
1d350 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1d360 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1d370 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1d380 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1d390 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1d3a0 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1d3b0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f  ate(pFile->h, (o
1d3c0 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69  ff_t)nByte);.  i
1d3d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1d3e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1d3f0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1d400 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1d410 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d420 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1d430 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1d440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
1d450 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d460 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d470 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1d480 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1d490 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1d4a0 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1d4b0 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d4c0 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1d4d0 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1d4e0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1d4f0 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1d500 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1d510 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1d520 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1d530 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1d540 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1d550 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d560 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1d570 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1d580 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1d590 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1d5a0 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1d5b0 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1d5c0 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1d5d0 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1d5e0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1d5f0 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1d600 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1d610 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1d620 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1d630 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1d640 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1d650 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
1d660 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75  ile was just tru
1d670 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
1d680 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1d690 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
1d6a0 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
1d6b0 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
1d6c0 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
1d6d0 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
1d6e0 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ite will.    ** 
1d6f0 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
1d700 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
1d710 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
1d720 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
1d730 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20   on.  .    */.  
1d740 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c    if( nByte<pFil
1d750 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1d760 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1d770 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
1d780 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1d790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d7a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1d7b0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1d7c0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1d7d0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1d7e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1d7f0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1d800 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1d810 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1d820 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1d830 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1d840 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1d850 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1d860 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1d870 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1d880 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1d890 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  c!=0 ){.    ((un
1d8a0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1d8b0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1d8c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d8d0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1d8e0 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
1d8f0 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a  f.st_size;..  /*
1d900 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1d910 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61  zero-size databa
1d920 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64  se, the findInod
1d930 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  eInfo() procedur
1d940 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
1d950 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
1d960 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
1d970 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
1d980 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
1d990 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
1d9a0 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
1d9b0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
1d9c0 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
1d9d0 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
1d9e0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
1d9f0 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
1da00 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
1da10 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
1da20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
1da30 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
1da40 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
1da50 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
1da60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1da70 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
1da80 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1da90 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1daa0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
1dab0 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72  * Handler for pr
1dac0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65  oxy-locking file
1dad0 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20  -control verbs. 
1dae0 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69   Defined below i
1daf0 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e  n the.** proxyin
1db00 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69  g locking divisi
1db10 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1db20 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
1db30 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
1db40 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  ,int,void*);.#en
1db50 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  dif../* .** This
1db60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1db70 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  led to handle th
1db80 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1db90 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c  IZE_HINT .** fil
1dba0 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74  e-control operat
1dbb0 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68  ion.  Enlarge th
1dbc0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42  e database to nB
1dbd0 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20  ytes in size.** 
1dbe0 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74  (rounded up to t
1dbf0 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69  he next chunk-si
1dc00 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74  ze).  If the dat
1dc10 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1dc20 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61  .** nBytes or la
1dc30 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69  rger, this routi
1dc40 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1dc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1dc60 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1dc70 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1dc80 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1dc90 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1dca0 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1dcd0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1dce0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1dcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1dd00 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1dd10 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1dd20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1dd30 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1dd40 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1dd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1dd60 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20  OERR_FSTAT;..   
1dd70 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1dd80 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1dd90 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1dda0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1ddb0 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1ddc0 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1ddd0 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1dde0 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1ddf0 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1de00 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1de10 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1de20 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1de30 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1de40 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1de50 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1de60 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1de70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1de80 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1de90 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1dea0 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1deb0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1dec0 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1ded0 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1dee0 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1def0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1df00 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1df10 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1df20 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1df30 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1df40 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1df50 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1df60 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1df70 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1df80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1df90 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1dfa0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1dfb0 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1dfc0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1dfd0 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73  ), fake it. Firs
1dfe0 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  t use.      ** f
1dff0 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65  truncate() to se
1e000 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1e010 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69   then write a si
1e020 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20  ngle byte to.   
1e030 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62     ** the last b
1e040 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1e050 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  k within the ext
1e060 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1e070 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
1e080 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75  he same techniqu
1e090 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  e used by glibc 
1e0a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73  to implement pos
1e0b0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20  ix_fallocate(). 
1e0c0 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65       ** on syste
1e0d0 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ms that do not h
1e0e0 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1e0f0 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  cate() system ca
1e100 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1e110 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1e120 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1e130 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1e140 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1e150 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e170 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1e180 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1e190 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1e1a0 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1e1b0 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  , nSize) ){.    
1e1c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1e1d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1e1e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1e1f0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1e200 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1e210 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1e220 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1e230 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
1e240 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
1e250 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
1e260 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
1e270 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74      while( iWrit
1e280 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  e<nSize ){.     
1e290 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1e2a0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1e2b0 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1e2c0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1e2d0 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1e2e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e2f0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69  WRITE;.        i
1e300 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20  Write += nBlk;. 
1e310 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1e320 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c    }.  }..#if SQL
1e330 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e340 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  E>0.  if( pFile-
1e350 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26  >mmapSizeMax>0 &
1e360 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d  & nByte>pFile->m
1e370 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
1e380 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  nt rc;.    if( p
1e390 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30  File->szChunk<=0
1e3a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f   ){.      if( ro
1e3b0 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1e3c0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20  File->h, nByte) 
1e3d0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1e3e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1e3f0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
1e400 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1e410 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1e420 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1e430 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1e440 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1e450 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1e460 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1e470 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1e480 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1e490 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1e4a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1e4b0 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1e4c0 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1e4d0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1e4e0 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1e4f0 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1e500 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1e510 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1e520 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1e530 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1e540 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1e550 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1e560 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1e570 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1e580 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1e590 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1e5a0 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65  ModeBit(unixFile
1e5b0 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1e5c0 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1e5d0 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1e5e0 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1e5f0 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1e600 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1e610 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1e620 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1e630 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1e640 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1e650 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1e660 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1e670 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1e680 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1e690 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1e6a0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1e6b0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1e6c0 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  zBuf);../*.** In
1e6d0 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1e6e0 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1e6f0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1e700 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e710 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1e720 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1e730 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1e740 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1e750 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1e760 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20  *)id;.  switch( 
1e770 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
1e780 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1e790 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1e7a0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1e7b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
1e7c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e7d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1e7e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
1e7f0 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1e800 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1e810 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1e820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e840 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e850 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1e860 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1e870 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1e880 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1e890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e8a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e8b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1e8c0 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1e8d0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d  nt rc;.      Sim
1e8e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1e8f0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1e900 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  = fcntlSizeHint(
1e910 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70  pFile, *(i64 *)p
1e920 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  Arg);.      Simu
1e930 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1e940 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n(0);.      retu
1e950 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1e960 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1e970 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1e980 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1e990 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1e9a0 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1e9b0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1e9c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e9d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e9e0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e9f0 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
1ea00 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75  WRITE: {.      u
1ea10 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1ea20 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c  , UNIXFILE_PSOW,
1ea30 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1ea40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ea50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1ea60 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ea70 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1ea80 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1ea90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1eaa0 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1eab0 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1eac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ead0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1eae0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1eaf0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
1eb00 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
1eb10 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
1eb20 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56  alloc( pFile->pV
1eb30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1eb40 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69  ;.      if( zTFi
1eb50 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  le ){.        un
1eb60 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  ixGetTempname(pF
1eb70 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
1eb80 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
1eb90 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1eba0 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1ebb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1ebc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ebd0 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
1ebe0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1ebf0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ec00 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1ec10 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65  : {.      i64 ne
1ec20 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29  wLimit = *(i64*)
1ec30 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  pArg;.      int 
1ec40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ec50 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1ec60 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  it>sqlite3Global
1ec70 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b  Config.mxMmap ){
1ec80 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
1ec90 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
1eca0 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a  lConfig.mxMmap;.
1ecb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28        }.      *(
1ecc0 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  i64*)pArg = pFil
1ecd0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  e->mmapSizeMax;.
1ece0 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1ecf0 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69  it>=0 && newLimi
1ed00 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t!=pFile->mmapSi
1ed10 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e  zeMax && pFile->
1ed20 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a  nFetchOut==0 ){.
1ed30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
1ed40 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
1ed50 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69  Limit;.        i
1ed60 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
1ed70 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1ed80 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
1ed90 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
1eda0 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69    rc = unixMapfi
1edb0 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
1edc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1edd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ede0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
1edf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1ee00 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
1ee10 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
1ee20 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
1ee30 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
1ee40 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
1ee50 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1ee60 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
1ee70 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
1ee80 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
1ee90 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
1eea0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1eeb0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1eec0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
1eed0 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
1eee0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1eef0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1ef00 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
1ef10 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
1ef20 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
1ef30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ef40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
1ef50 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
1ef60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1ef70 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1ef80 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
1ef90 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
1efa0 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1efb0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
1efc0 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
1efd0 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
1efe0 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
1eff0 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
1f000 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1f010 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f020 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1f030 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
1f040 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f050 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1f060 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1f070 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1f080 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1f090 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1f0a0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1f0b0 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1f0c0 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1f0d0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1f0e0 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1f0f0 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1f100 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1f110 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1f120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1f130 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1f140 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1f150 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1f160 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1f170 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1f180 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1f190 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1f1a0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1f1b0 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1f1c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1f1d0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1f1e0 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69   for both..*/.#i
1f1f0 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  fndef __QNXNTO__
1f200 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69   .static int uni
1f210 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1f220 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
1f230 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
1f240 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1f250 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f260 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1f270 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  SIZE;.}.#endif..
1f280 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1f290 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75  ing version of u
1f2a0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  nixSectorSize() 
1f2b0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
1f2c0 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   QNX..*/.#ifdef 
1f2d0 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c  __QNXNTO__.#incl
1f2e0 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c  ude <sys/dcmd_bl
1f2f0 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  k.h>.#include <s
1f300 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74  ys/statvfs.h>.st
1f310 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1f320 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1f330 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
1f340 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1f350 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1f360 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
1f370 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20  rSize == 0 ){.  
1f380 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73    struct statvfs
1f390 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20   fsInfo;.       
1f3a0 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61  .    /* Set defa
1f3b0 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70  ults for non-sup
1f3c0 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65  ported filesyste
1f3d0 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ms */.    pFile-
1f3e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
1f3f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1f400 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46  TOR_SIZE;.    pF
1f410 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f420 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1f430 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73      if( fstatvfs
1f440 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e  (pFile->h, &fsIn
1f450 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20  fo) == -1 ) {.  
1f460 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
1f470 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
1f480 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74    }..    if( !st
1f490 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
1f4a0 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29  setype, "tmp") )
1f4b0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1f4c0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1f4d0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1f4e0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f4f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f500 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
1f510 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20  _IOCAP_ATOMIC4K 
1f520 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72  |       /* All r
1f530 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  am filesystem wr
1f540 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1f550 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1f560 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1f570 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1f580 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1f590 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1f5a0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1f5d0 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1f5e0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f5f0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f600 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1f610 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1f620 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1f630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1f660 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1f670 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1f680 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
1f690 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1f6a0 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20   "etfs") ){.    
1f6b0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f6c0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1f6d0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1f6e0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f6f0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1f700 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74     /* etfs clust
1f710 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61  er size writes a
1f720 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
1f730 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63       (pFile->sec
1f740 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1f750 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1f760 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20  MIC512) |.      
1f770 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1f780 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1f790 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1f7a0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1f7b0 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f7e0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1f7f0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1f800 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f810 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1f820 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1f830 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1f840 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f870 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1f880 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1f890 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
1f8a0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
1f8b0 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29  asetype, "qnx6")
1f8c0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1f8d0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1f8e0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1f8f0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f900 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f910 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
1f920 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c  E_IOCAP_ATOMIC |
1f930 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
1f940 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
1f950 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
1f960 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f970 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1f980 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1f990 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1f9a0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1f9e0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1f9f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fa00 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1fa10 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1fa20 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1fa30 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1fa70 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1fa80 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1fa90 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1faa0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1fab0 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx4") ){.      
1fac0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fad0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1fae0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1faf0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fb00 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1fb10 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20   /* full bitset 
1fb20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20  of atomics from 
1fb30 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20  max sector size 
1fb40 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20  and smaller */. 
1fb50 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e         ((pFile->
1fb60 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
1fb70 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
1fb80 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29  ATOMIC512) << 1)
1fb90 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53   - 2 |.        S
1fba0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1fbb0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1fbc0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1fbd0 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1fbe0 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fc10 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1fc20 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1fc30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1fc40 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1fc50 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b  etype, "dos") ){
1fc60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1fc70 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1fc80 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1fc90 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1fca0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1fcb0 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
1fcc0 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
1fcd0 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
1fce0 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
1fcf0 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
1fd00 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fd10 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
1fd20 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1fd30 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
1fd40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fd50 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1fd60 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1fd70 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1fd80 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1fdc0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1fdd0 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     0;.    }else{
1fde0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1fdf0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fe00 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1fe10 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fe20 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62  C512 |      /* b
1fe30 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63  locks are atomic
1fe40 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1fe50 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1fe60 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1fe70 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1fe80 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1fe90 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1fec0 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1fed0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1fee0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74   }.  }.  /* Last
1fef0 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61   chance verifica
1ff00 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1ff10 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20  ctor size isn't 
1ff20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31  a multiple of 51
1ff30 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  2.  ** then it i
1ff40 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20  sn't valid.*/.  
1ff50 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
1ff60 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30  rSize % 512 != 0
1ff70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
1ff80 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ff90 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46  tics = 0;.    pF
1ffa0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1ffb0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1ffc0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1ffd0 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  }.  return pFile
1ffe0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a  ->sectorSize;.}.
1fff0 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e  #endif /* __QNXN
20000 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TO__ */../*.** R
20010 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
20020 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
20030 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a   for the file..*
20040 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73  *.** This VFS is
20050 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72   set up to retur
20060 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  n SQLITE_IOCAP_P
20070 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20080 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a  TE by default..*
20090 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
200a0 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 61  choice is contra
200b0 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65  versial since te
200c0 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e  chnically the un
200d0 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65  derlying.** file
200e0 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
200f0 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20   always provide 
20100 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72  powersafe overwr
20110 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72  ites.  (In other
20120 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72  .** words, after
20130 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76   a power-loss ev
20140 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68  ent, parts of th
20150 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65  e file that were
20160 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65   never.** writte
20170 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  n might end up b
20180 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20  eing altered.)  
20190 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f  However, non-PSO
201a0 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65  W behavior is ve
201b0 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65  ry,.** very rare
201c0 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67  .  And asserting
201d0 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61   PSOW makes a la
201e0 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e  rge reduction in
201f0 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f   the amount.** o
20200 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66  f required I/O f
20210 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73  or journaling, s
20220 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61  ince a lot of pa
20230 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61  dding is elimina
20240 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20  ted..**  Hence, 
20250 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f  while POWERSAFE_
20260 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20  OVERWRITE is on 
20270 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  by default, ther
20280 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74  e is a file-cont
20290 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  rol.** available
202a0 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20   to turn it off 
202b0 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61  and URI query pa
202c0 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c  rameter availabl
202d0 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
202e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
202f0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
20300 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
20310 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
20320 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
20330 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
20340 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  t rc = 0;.#ifdef
20350 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66   __QNXNTO__.  if
20360 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  ( p->sectorSize=
20370 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53  =0 ) unixSectorS
20380 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20  ize(id);.  rc = 
20390 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  p->deviceCharact
203a0 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66  eristics;.#endif
203b0 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c  .  if( p->ctrlFl
203c0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
203d0 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d  SOW ){.    rc |=
203e0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
203f0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
20400 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
20410 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
20420 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
20430 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
20440 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
20450 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  an shared memory
20460 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a   buffer.  .**.**
20470 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
20480 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
20490 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61  ence the same wa
204a0 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68  l-index, each th
204b0 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20  read.** has its 
204c0 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  own unixShm obje
204d0 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
204e0 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
204f0 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  le instance.** o
20500 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  f this unixShmNo
20510 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  de object.  In o
20520 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
20530 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70   wal-index is op
20540 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63  ened.** only onc
20550 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
20560 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68  *.** Each unixSh
20570 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
20580 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73  connected to a s
20590 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49  ingle unixInodeI
205a0 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57  nfo object..** W
205b0 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65  e could coalesce
205c0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74   this object int
205d0 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c  o unixInodeInfo,
205e0 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   but that would 
205f0 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70  mean.** every op
20600 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65  en file that doe
20610 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64  s not use shared
20620 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65   memory (in othe
20630 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a  r words, most.**
20640 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75   open files) wou
20650 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79  ld have to carry
20660 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74   around this ext
20670 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ra information. 
20680 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49   So.** the unixI
20690 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
206a0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
206b0 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53  er to this unixS
206c0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a  hmNode object.**
206d0 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d   and the unixShm
206e0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
206f0 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  reated only when
20700 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75   needed..**.** u
20710 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
20720 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
20730 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
20740 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
20750 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
20760 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
20770 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
20780 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
20790 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54      nRef.**.** T
207a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
207b0 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
207c0 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
207d0 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
207e0 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
207f0 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
20800 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e  .**.** Either un
20810 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  ixShmNode.mutex 
20820 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
20830 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
20840 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d  ==0 and.** unixM
20850 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
20860 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
20870 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
20880 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
20890 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
208a0 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
208b0 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49  hmNode {.  unixI
208c0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
208d0 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f  ;     /* unixIno
208e0 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73  deInfo that owns
208f0 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a   this SHM node *
20900 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
20910 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
20920 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
20930 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
20940 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
20950 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
20960 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61   Name of the mma
20970 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
20980 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
20990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
209a0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
209b0 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  r */.  int szReg
209c0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
209d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
209e0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
209f0 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67  ns */.  u16 nReg
20a00 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
20a10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
20a20 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
20a30 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b    u8 isReadonly;
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a50 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c  True if read-onl
20a60 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70  y */.  char **ap
20a70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
20a80 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61    /* Array of ma
20a90 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  pped shared-memo
20aa0 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
20ab0 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
20ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20ad0 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20  mber of unixShm 
20ae0 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
20af0 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e   to this */.  un
20b00 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  ixShm *pFirst;  
20b10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
20b20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
20b30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
20b40 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
20b50 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63  E_DEBUG.  u8 exc
20b60 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
20b70 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20b80 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
20b90 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61  held */.  u8 sha
20ba0 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
20bb0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20bc0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
20bd0 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68  d */.  u8 nextSh
20be0 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
20bf0 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
20c00 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76  ble unixShm.id v
20c10 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
20c20 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
20c30 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
20c40 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
20c50 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
20c60 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
20c70 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
20c80 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
20c90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
20ca0 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
20cb0 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
20cc0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
20cd0 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
20ce0 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
20cf0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78  r:.**.**    unix
20d00 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20  Shm.pFile.**    
20d10 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a  unixShm.id.**.**
20d20 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
20d30 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
20d40 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70  .  The unixShm.p
20d50 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  File->mutex must
20d60 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
20d70 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
20d80 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
20d90 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
20da0 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
20db0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
20dc0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
20dd0 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
20de0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
20df0 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
20e00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
20e10 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
20e20 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
20e30 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
20e40 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
20e50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
20e60 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
20e70 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
20e80 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
20e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
20ea0 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
20eb0 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
20ec0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
20ed0 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
20ef0 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
20f00 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
20f10 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
20f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20f30 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
20f40 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a  cks held */.};..
20f50 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
20f60 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
20f70 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
20f80 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
20f90 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
20fa0 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a  K)*4)         /*
20fb0 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
20fc0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
20fd0 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49  _SHM_DMS    (UNI
20fe0 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  X_SHM_BASE+SQLIT
20ff0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
21000 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
21010 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
21020 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
21030 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74  ocks for all byt
21040 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72  es from ofst thr
21050 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a  ough ofst+n-1..*
21060 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b  *.** Locks block
21070 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20   if the mask is 
21080 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d  exactly UNIX_SHM
21090 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62  _C and are non-b
210a0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  locking.** other
210b0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
210c0 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65  int unixShmSyste
210d0 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d  mLock(.  unixShm
210e0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20  Node *pShmNode, 
210f0 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
21100 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
21110 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
21120 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
21130 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ype,          /*
21140 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43   F_UNLCK, F_RDLC
21150 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f  K, or F_WRLCK */
21160 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
21170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
21180 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c  st byte of the l
21190 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a  ocking range */.
211a0 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20    int n         
211b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
211c0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
211d0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
211e0 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20  ct flock f;     
211f0 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61    /* The posix a
21200 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20  dvisory locking 
21210 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
21220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21230 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63  K;   /* Result c
21240 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29  ode form fcntl()
21250 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
21260 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   to the unixShmN
21270 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
21280 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
21290 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
212a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
212b0 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d  x_held(pShmNode-
212c0 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e  >mutex) || pShmN
212d0 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ode->nRef==0 );.
212e0 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63  .  /* Shared loc
212f0 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f  ks never span mo
21300 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65  re than one byte
21310 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   */.  assert( n=
21320 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d  =1 || lockType!=
21330 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a  F_RDLCK );..  /*
21340 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69   Locks are withi
21350 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73  n range */.  ass
21360 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53  ert( n>=1 && n<S
21370 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
21380 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
21390 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
213a0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
213b0 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
213c0 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  ters */.    mems
213d0 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
213e0 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79  (f));.    f.l_ty
213f0 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20  pe = lockType;. 
21400 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20     f.l_whence = 
21410 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e  SEEK_SET;.    f.
21420 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a  l_start = ofst;.
21430 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b      f.l_len = n;
21440 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  ..    rc = osFcn
21450 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
21460 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20  F_SETLK, &f);.  
21470 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
21480 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
21490 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
214a0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
214b0 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
214c0 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
214d0 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
214e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
214f0 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20    { u16 mask;.  
21500 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
21510 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d  CK "));.  mask =
21520 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
21530 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
21540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21550 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
21560 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
21570 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21580 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
21590 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
215a0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
215b0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
215c0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
215d0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
215e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
215f0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
21600 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21610 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
21620 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
21630 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
21640 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
21650 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
21660 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
21670 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
21680 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
21690 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
216a0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
216b0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
216c0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
216d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
216e0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
216f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
21700 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
21710 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
21720 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
21730 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
21740 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
21750 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
21760 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
21770 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
21780 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
21790 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
217a0 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
217b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
217c0 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
217d0 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
217e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
217f0 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
21800 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
21810 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
21820 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
21830 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
21840 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
21850 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
21860 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
21870 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
21880 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
21890 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a          .}.../*.
218a0 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
218b0 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
218c0 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
218d0 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
218e0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
218f0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
21900 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
21910 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
21920 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
21930 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
21940 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
21950 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
21960 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
21970 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
21980 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
21990 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
219a0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
219b0 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
219c0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
219d0 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d  f( p && p->nRef=
219e0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
219f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
21a00 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e  pInode==pFd->pIn
21a10 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ode );.    sqlit
21a20 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
21a30 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
21a40 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
21a50 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
21a60 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
21a70 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28         osMunmap(
21a80 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
21a90 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
21aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ab0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21ac0 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b  p->apRegion[i]);
21ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21ae0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21af0 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20  p->apRegion);.  
21b00 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
21b10 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
21b20 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f  ose(pFd, p->h, _
21b30 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
21b40 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  p->h = -1;.    }
21b50 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
21b60 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
21b70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
21b80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21b90 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65  Open a shared-me
21ba0 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
21bb0 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64  ated with open d
21bc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
21bd0 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61  Fd.  .** This pa
21be0 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65  rticular impleme
21bf0 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61  ntation uses mma
21c00 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
21c10 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20  * The file used 
21c20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61  to implement sha
21c30 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e  red-memory is in
21c40 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
21c50 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70  ory.** as the op
21c60 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
21c70 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
21c80 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70  e name as the op
21c90 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  en database.** f
21ca0 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73  ile with the "-s
21cb0 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64  hm" suffix added
21cc0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
21cd0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
21ce0 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d  file.** is "/hom
21cf0 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
21d00 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  b" then the file
21d10 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
21d20 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20   and mmapped.** 
21d30 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
21d40 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  y will be called
21d50 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
21d60 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a  nfig.db-shm".  .
21d70 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70  **.** Another ap
21d80 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20  proach to is to 
21d90 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65  use files in /de
21da0 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d  v/shm or /dev/tm
21db0 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20  p or an.** some 
21dc0 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e  other tmpfs moun
21dd0 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65  t. But if a file
21de0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
21df0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f  directory.** fro
21e00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
21e10 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  ile is used, the
21e20 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65  n differing acce
21e30 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ss permissions.*
21e40 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20  * or a chroot() 
21e50 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20  might cause two 
21e60 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
21e70 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ses on the same.
21e80 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65  ** database to e
21e90 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66  nd up using diff
21ea0 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20  erent files for 
21eb0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20  shared memory - 
21ec0 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  .** meaning that
21ed0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f   their memory wo
21ee0 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  uld not really b
21ef0 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c  e shared - resul
21f00 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62  ting.** in datab
21f10 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
21f20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74   Nevertheless, t
21f30 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75  his tmpfs file u
21f40 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65  sage.** can be e
21f50 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
21f60 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
21f70 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
21f80 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a  ORY="/dev/shm".*
21f90 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c  * or the equival
21fa0 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ent.  The use of
21fb0 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   the SQLITE_SHM_
21fc0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
21fd0 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e  e-time.** option
21fe0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69   results in an i
21ff0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c  ncompatible buil
22000 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75  d of SQLite;  bu
22010 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a  ilds of SQLite.*
22020 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66  * that with diff
22030 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d  ering SQLITE_SHM
22040 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69  _DIRECTORY setti
22050 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ngs attempt to u
22060 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64  se the.** same d
22070 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
22080 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
22090 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
220a0 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  on will likely.*
220b0 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51  * result. The SQ
220c0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
220d0 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  RY compile-time 
220e0 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64  option is consid
220f0 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f  ered.** "unsuppo
22100 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f  rted" and may go
22110 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72   away in a futur
22120 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  e SQLite release
22130 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
22140 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
22150 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
22160 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
22170 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
22180 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
22190 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
221a0 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
221b0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
221c0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
221d0 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
221e0 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
221f0 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
22200 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  ader cleared..**
22210 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69  .** If the origi
22220 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
22230 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69  e (pDbFd) is usi
22240 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63  ng the "unix-exc
22250 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d  l" VFS.** that m
22260 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63  eans that an exc
22270 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
22280 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
22290 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  ase file and.** 
222a0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
222b0 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65  ocesses are able
222c0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
222d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
222e0 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65   In.** that case
222f0 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c  , we do not real
22300 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d  ly need shared m
22310 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65  emory.  No share
22320 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65  d memory.** file
22330 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
22340 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
22350 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65  will be simulate
22360 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f  d with heap memo
22370 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
22380 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  t unixOpenShared
22390 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
223a0 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
223b0 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30  t unixShm *p = 0
223c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
223d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
223e0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
223f0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
22400 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f  e *pShmNode;   /
22410 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
22420 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
22430 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
22460 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
22470 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
22480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
22490 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63  ode of fd */.  c
224a0 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d  har *zShmFilenam
224b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
224c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
224d0 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20  le used for SHM 
224e0 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c  */.  int nShmFil
224f0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
22500 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22510 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65  the SHM filename
22520 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
22530 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
22540 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  e for the new un
22550 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f  ixShm object. */
22560 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
22570 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
22580 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
22590 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
225a0 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
225b0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
225c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
225d0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a  Fd->pShm==0 );..
225e0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
225f0 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f  e if a unixShmNo
22600 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64  de object alread
22610 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20  y exists. Reuse 
22620 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
22630 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e   one if present.
22640 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
22650 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
22660 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
22670 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
22680 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
22690 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  e;.  pShmNode = 
226a0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
226b0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
226c0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
226d0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226f0 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f   fstat() info fo
22700 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
22710 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  */..    /* Call 
22720 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72  fstat() to figur
22730 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73  e out the permis
22740 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74  sions on the dat
22750 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20  abase file. If. 
22760 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68     ** a new *-sh
22770 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  m file is create
22780 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69  d, an attempt wi
22790 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72  ll be made to cr
227a0 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77  eate it.    ** w
227b0 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72  ith the same per
227c0 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f  missions..    */
227d0 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
227e0 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61  (pDbFd->h, &sSta
227f0 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50  t) && pInode->bP
22800 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
22810 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22820 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
22830 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
22840 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
22850 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
22860 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
22870 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
22880 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
22890 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31  _DIRECTORY) + 31
228a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
228b0 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28  Filename = 6 + (
228c0 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64  int)strlen(pDbFd
228d0 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  ->zPath);.#endif
228e0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
228f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
22900 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
22910 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
22920 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
22930 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
22940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22950 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
22960 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
22970 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53   }.    memset(pS
22980 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  hmNode, 0, sizeo
22990 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68  f(*pShmNode)+nSh
229a0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
229b0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70  zShmFilename = p
229c0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
229d0 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68  me = (char*)&pSh
229e0 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66  mNode[1];.#ifdef
229f0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22a00 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65  CTORY.    sqlite
22a10 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
22a20 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
22a30 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  ename, .        
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
22a50 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22a60 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25  Y "/sqlite-shm-%
22a70 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20  x-%x",.         
22a80 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
22a90 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28  )sStat.st_ino, (
22aa0 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76  u32)sStat.st_dev
22ab0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
22ac0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
22ad0 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
22ae0 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
22af0 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
22b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
22b10 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
22b20 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65  >zPath, zShmFile
22b30 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  name);.#endif.  
22b40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
22b50 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70  -1;.    pDbFd->p
22b60 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
22b70 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20  = pShmNode;.    
22b80 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
22b90 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
22ba0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
22bb0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
22bc0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
22bd0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
22be0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
22bf0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
22c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22c10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
22c20 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22c30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
22c40 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
22c50 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
22c60 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
22c70 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
22c80 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
22c90 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
22ca0 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
22cb0 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
22cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   ){.        open
22cd0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
22ce0 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  ;.        pShmNo
22cf0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
22d00 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22d10 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
22d20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
22d30 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c  Filename, openFl
22d40 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d  ags, (sStat.st_m
22d50 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20  ode&0777));.    
22d60 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
22d70 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  h<0 ){.        r
22d80 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
22d90 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
22da0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
22db0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
22dc0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
22dd0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
22de0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
22df0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
22e00 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d  nning as root, m
22e10 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
22e20 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20  e SHM file.     
22e30 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20   ** is owned by 
22e40 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68  the same user th
22e50 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67  at owns the orig
22e60 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  inal database.  
22e70 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
22e80 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
22e90 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20   owner will not 
22ea0 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  be able to conne
22eb0 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
22ec0 20 20 20 6f 73 46 63 68 6f 77 6e 28 70 53 68 6d     osFchown(pShm
22ed0 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73  Node->h, sStat.s
22ee0 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f  t_uid, sStat.st_
22ef0 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f  gid);.  .      /
22f00 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
22f10 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
22f20 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
22f30 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
22f40 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ..      ** If no
22f50 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
22f60 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
22f70 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  gth. .      */. 
22f80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22f90 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75  _OK;.      if( u
22fa0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
22fb0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
22fc0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
22fd0 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 1)==SQLITE_OK 
22fe0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
22ff0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
23000 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20  pShmNode->h, 0) 
23010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23020 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
23030 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
23040 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22  PEN, "ftruncate"
23050 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
23060 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23070 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
23080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23090 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
230a0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
230b0 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
230c0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
230d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
230e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
230f0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
23100 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
23110 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
23120 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
23130 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
23140 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
23150 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
23160 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
23170 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
23180 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
23190 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
231a0 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
231b0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
231c0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
231d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
231e0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
231f0 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
23200 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
23210 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
23220 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
23230 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
23240 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
23250 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
23260 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
23270 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
23280 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
23290 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
232a0 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
232b0 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
232c0 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
232d0 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
232e0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
232f0 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
23300 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
23310 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
23320 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
23330 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
23340 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
23350 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
23360 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
23370 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
23380 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
23390 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
233a0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
233b0 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
233c0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
233d0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
233e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
233f0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
23400 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
23410 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
23420 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
23430 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
23440 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
23450 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
23460 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
23470 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
23480 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
23490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
234a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
234b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
234c0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
234d0 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
234e0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
234f0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
23500 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
23510 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
23520 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
23530 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
23540 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
23550 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
23560 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
23570 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
23580 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
23590 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
235a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
235b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
235c0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
235d0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
235e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
235f0 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
23600 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
23610 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
23620 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
23630 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
23640 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
23650 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
23660 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
23670 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
23680 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
23690 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
236a0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
236b0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
236c0 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
236d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
236e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
236f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
23700 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
23710 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
23720 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
23730 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
23740 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
23750 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
23760 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
23770 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
23780 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
23790 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
237a0 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
237b0 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
237c0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
237d0 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
237e0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
237f0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
23800 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
23810 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
23820 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
23830 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
23840 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
23850 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
23860 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
23870 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
23880 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
23890 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
238a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
238b0 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
238c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
238d0 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
238e0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
238f0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
23900 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
23910 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
23920 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23940 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
23950 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
23960 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
23970 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
23980 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
23990 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
239a0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
239b0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
239c0 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
239d0 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
239e0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
239f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23a00 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  OK;..  /* If the
23a10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
23a20 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
23a30 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
23a40 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69  n it now. */.  i
23a50 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  f( pDbFd->pShm==
23a60 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  0 ){.    rc = un
23a70 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
23a80 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
23a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23aa0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23ab0 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  }..  p = pDbFd->
23ac0 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  pShm;.  pShmNode
23ad0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
23ae0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23af0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
23b00 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
23b10 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
23b20 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
23b30 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
23b40 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ion==0 );.  asse
23b50 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
23b60 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
23b70 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
23b80 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
23b90 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
23ba0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
23bb0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
23bc0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
23bd0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
23be0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
23bf0 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
23c00 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
23c10 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ion ){.    char 
23c20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20  **apNew;        
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23c40 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20   New apRegion[] 
23c50 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
23c60 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
23c70 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
23c80 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
23c90 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
23ca0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
23cb0 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
23cc0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
23cd0 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20  by fstat() */.. 
23ce0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
23cf0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
23d00 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ;..    if( pShmN
23d10 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
23d20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
23d30 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
23d40 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
23d50 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
23d60 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
23d70 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
23d80 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
23d90 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
23da0 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
23db0 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20  x file is.      
23dc0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
23dd0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
23de0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
23df0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23e00 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68   if( osFstat(pSh
23e10 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
23e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
23e30 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
23e40 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
23e50 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
23e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
23e70 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f     if( sStat.st_
23e80 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20  size<nByte ){.  
23e90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
23ea0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
23eb0 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
23ec0 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20  ist. If bExtend 
23ed0 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
23ee0 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
23ef0 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
23f00 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
23f10 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23f20 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20  turned..        
23f30 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
23f40 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20  bExtend ){.     
23f50 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
23f60 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
23f70 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74  ..        /* Alt
23f80 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62  ernatively, if b
23f90 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20  Extend is true, 
23fa0 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
23fb0 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20   Do this by.    
23fc0 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61      ** writing a
23fd0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
23fe0 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20  the end of each 
23ff0 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a  (OS) page being.
24000 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
24010 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
24020 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  . Technically, w
24030 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74  e need only writ
24040 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  e to the.       
24050 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e   ** last page in
24060 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64   order to extend
24070 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77   the file. But w
24080 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65  riting to all ne
24090 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
240a0 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53  es forces the OS
240b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
240c0 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77  m immediately, w
240d0 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20 20  hich reduces.   
240e0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e       ** the chan
240f0 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77 68  ces of SIGBUS wh
24100 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ile accessing th
24110 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
24120 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20  later on..      
24130 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73    */.        els
24140 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  e{.          sta
24150 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67  tic const int pg
24160 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20  sz = 4096;.     
24170 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20       int iPg;.. 
24180 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
24190 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
241a0 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79  te of each newly
241b0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
241c0 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20  tended page */. 
241d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
241e0 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d   (nByte % pgsz)=
241f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
24200 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73  for(iPg=(sStat.s
24210 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50  t_size/pgsz); iP
24220 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20  g<(nByte/pgsz); 
24230 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPg++){.        
24240 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57      if( seekAndW
24250 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d  riteFd(pShmNode-
24260 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70  >h, iPg*pgsz + p
24270 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29  gsz-1, "", 1, 0)
24280 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=1 ){.         
24290 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
242a0 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64  *zFile = pShmNod
242b0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  e->zFilename;.  
242c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
242d0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
242e0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
242f0 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69  ZE, "write", zFi
24300 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  le);.           
24310 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24320 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  out;.           
24330 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
24340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
24360 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
24370 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
24380 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
24390 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
243a0 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
243b0 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
243c0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
243d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
243e0 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
243f0 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  1)*sizeof(char *
24400 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
24410 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
24420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
24430 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
24440 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
24460 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
24470 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
24480 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  e(pShmNode->nReg
24490 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20  ion<=iRegion){. 
244a0 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
244b0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
244c0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
244d0 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d       pMem = osMm
244e0 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a  ap(0, szRegion,.
244f0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
24500 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
24510 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
24520 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
24530 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
24540 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
24550 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67  hmNode->h, szReg
24560 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64  ion*(i64)pShmNod
24570 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20  e->nRegion.     
24580 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
24590 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c  ( pMem==MAP_FAIL
245a0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
245b0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
245c0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
245d0 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70  HMMAP, "mmap", p
245e0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
245f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
24600 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24630 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
24640 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b  alloc(szRegion);
24650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
24660 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
24670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
24680 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
24690 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
246a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
246b0 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
246c0 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
246d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
246e0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70  Node->apRegion[p
246f0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24700 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20  ] = pMem;.      
24710 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
24720 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
24730 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
24740 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
24750 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
24760 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
24770 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
24780 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
24790 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
247a0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
247b0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
247c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
247d0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
247e0 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
247f0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
24800 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
24810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24820 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
24830 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
24840 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
24850 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
24860 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
24870 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
24880 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
24890 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
248a0 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
248b0 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
248c0 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
248d0 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
248e0 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
248f0 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
24900 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
24910 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
24920 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
24930 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
24940 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
24950 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
24960 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
24970 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
24980 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
24990 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
249a0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
249b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
249c0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
249d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
249e0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a00 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
24a10 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
24a20 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
24a50 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
24a60 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
24a70 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
24a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
24a90 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
24aa0 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
24ab0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
24ac0 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
24ad0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
24ae0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
24af0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
24b00 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
24b10 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
24b20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
24b30 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
24b40 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
24b50 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
24b80 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
24b90 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
24ba0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
24bb0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
24bc0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
24bd0 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
24be0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24bf0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
24c00 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
24c10 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
24c20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24c40 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
24c50 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
24c60 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
24c70 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
24c80 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
24c90 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
24ca0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
24cb0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
24cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
24cd0 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
24ce0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
24cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
24d00 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
24d10 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
24d20 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
24d30 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
24d40 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
24d50 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
24d60 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
24d70 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
24d80 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
24d90 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
24da0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
24db0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
24dc0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
24dd0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
24de0 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
24df0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
24e00 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24e10 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
24e20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
24e30 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
24e40 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
24e50 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
24e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24e70 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
24e80 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
24e90 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
24ea0 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
24eb0 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
24ec0 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
24ed0 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
24ee0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
24ef0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24f00 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
24f10 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
24f20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
24f30 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
24f40 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
24f50 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
24f60 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
24f70 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
24f80 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
24f90 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
24fa0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
24fb0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
24fc0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
24fd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
24fe0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
24ff0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
25000 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
25010 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
25020 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
25030 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
25040 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
25050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
25060 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
25070 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
25080 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
25090 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
250a0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
250b0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
250c0 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66  ode, F_UNLCK, of
250d0 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
250e0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
250f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25100 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
25110 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
25120 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
25130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
25150 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
25160 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
25170 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
25180 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
25190 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
251a0 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
251b0 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
251c0 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
251d0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
251e0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
251f0 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
25200 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
25210 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
25220 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
25230 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
25240 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
25250 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
25260 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
25270 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
25280 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
25290 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
252a0 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
252b0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
252c0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
252d0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
252e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
252f0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
25300 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
25310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
25320 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
25330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25340 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
25350 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
25360 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
25370 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
25380 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
25390 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
253a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
253b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
253c0 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
253d0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
253e0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
253f0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
25400 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  Node, F_RDLCK, o
25410 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
25420 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
25430 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
25440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25450 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
25460 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
25470 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
25480 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25490 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
254a0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
254b0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
254c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
254d0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
254e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
254f0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
25500 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
25510 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
25520 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
25530 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
25540 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
25550 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
25560 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
25570 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
25580 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
25590 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
255a0 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
255b0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
255c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
255d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
255e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
255f0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
25600 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
25610 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
25620 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
25630 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
25640 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
25650 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
25660 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
25670 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
25680 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
256a0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
256b0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
256c0 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_WRLCK, ofst+UN
256d0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
256e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
256f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25700 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
25710 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
25720 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
25730 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
25740 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
25750 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
25760 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
25770 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
25780 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
25790 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
257a0 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
257b0 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
257c0 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64     p->id, getpid
257d0 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  (), p->sharedMas
257e0 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  k, p->exclMask))
257f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25800 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
25810 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
25820 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
25830 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
25840 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ory.  .**.** All
25850 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
25860 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
25870 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
25880 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
25890 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
258a0 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
258b0 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
258c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
258d0 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  xShmBarrier(.  s
258e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25900 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
25910 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
25920 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
25930 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25940 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45 6e  ER(fd);.  unixEn
25950 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75 6e  terMutex();.  un
25960 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
25970 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
25980 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
25990 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
259a0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
259b0 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
259c0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
259d0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
259e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61   there is no sha
259f0 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
25a00 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63  iated with the c
25a10 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74  onnection then t
25a20 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
25a30 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
25a40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
25a50 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a  t unixShmUnmap(.
25a60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
25a70 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
25a80 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
25a90 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
25aa0 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  e */.  int delet
25ab0 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
25ac0 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
25ad0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
25ae0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  f true */.){.  u
25af0 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  nixShm *p;      
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b10 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
25b20 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
25b30 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
25b40 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
25b50 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
25b60 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
25b70 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ry file */.  uni
25b80 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  xShm **pp;      
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ba0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
25bb0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
25bc0 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69  ions */.  unixFi
25bd0 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
25be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25bf0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
25c00 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
25c10 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
25c20 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
25c30 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
25c40 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
25c50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
25c60 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
25c70 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  e;..  assert( pS
25c80 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
25c90 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
25ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
25cb0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
25cc0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
25cd0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
25ce0 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
25cf0 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
25d00 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
25d10 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
25d20 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
25d30 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
25d40 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
25d50 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
25d60 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
25d70 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
25d80 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
25d90 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
25da0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
25db0 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
25dc0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
25dd0 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
25de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
25df0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
25e00 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
25e10 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
25e20 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
25e30 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
25e40 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
25e50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
25e60 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69  le, too */.  uni
25e70 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
25e80 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25e90 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
25ea0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
25eb0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
25ec0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
25ed0 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26  if( deleteFlag &
25ee0 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  & pShmNode->h>=0
25ef0 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d   ) osUnlink(pShm
25f00 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
25f10 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  ;.    unixShmPur
25f20 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
25f30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
25f40 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
25f50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
25f60 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
25f70 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
25f80 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
25f90 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
25fa0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
25fb0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
25fc0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
25fd0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
25fe0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
25ff0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
26000 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
26010 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   If it is curren
26020 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  tly memory mappe
26030 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46  d, unmap file pF
26040 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
26050 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
26060 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
26070 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
26080 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
26090 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
260a0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75  gion ){.    osMu
260b0 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
260c0 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53  gion, pFd->mmapS
260d0 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20  izeActual);.    
260e0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
260f0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
26100 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
26110 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
26120 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ual = 0;.  }.}..
26130 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26140 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   system page siz
26150 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26160 20 75 6e 69 78 47 65 74 50 61 67 65 73 69 7a 65   unixGetPagesize
26170 28 76 6f 69 64 29 7b 0a 23 69 66 20 48 41 56 45  (void){.#if HAVE
26180 5f 4d 52 45 4d 41 50 0a 20 20 72 65 74 75 72 6e  _MREMAP.  return
26190 20 35 31 32 3b 0a 23 65 6c 69 66 20 64 65 66 69   512;.#elif defi
261a0 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29  ned(_BSD_SOURCE)
261b0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67  .  return getpag
261c0 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20  esize();.#else. 
261d0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73   return (int)sys
261e0 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a  conf(_SC_PAGESIZ
261f0 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  E);.#endif.}../*
26200 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
26210 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
26220 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
26230 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  g maintained by 
26240 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
26250 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20  tor pFd to nNew 
26260 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74  bytes. Any exist
26270 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64  ing mapping is d
26280 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  iscarded..**.** 
26290 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
262a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
262b0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
262c0 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
262d0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
262e0 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20  pMapRegion.**   
262f0 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
26300 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75  pSize.**       u
26310 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
26320 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20  Actual.**.** If 
26330 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  unsuccessful, an
26340 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
26350 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c  s logged via sql
26360 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a  ite3_log() and.*
26370 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  * the three vari
26380 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20  ables above are 
26390 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20  zeroed. In this 
263a0 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75  case SQLite shou
263b0 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  ld.** continue a
263c0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
263d0 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
263e0 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69  xRead() and xWri
263f0 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e  te().** methods.
26400 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26410 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20  unixRemapfile(. 
26420 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20   unixFile *pFd, 
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
26450 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tor object */.  
26460 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20  i64 nNew        
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70  /* Required mapp
26490 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ing size */.){. 
264a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
264b0 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e  r = "mmap";.  in
264c0 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20  t h = pFd->h;   
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
264f0 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62  iptor open on db
26500 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70   file */.  u8 *p
26510 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64  Orig = (u8 *)pFd
26520 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20  ->pMapRegion;   
26530 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
26540 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69  rrent file mappi
26550 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69  ng */.  i64 nOri
26560 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  g = pFd->mmapSiz
26570 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20  eActual;     /* 
26580 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65  Size of pOrig re
26590 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  gion in bytes */
265a0 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b  .  u8 *pNew = 0;
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
265d0 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ion of new mappi
265e0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ng */.  int flag
265f0 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20  s = PROT_READ;  
26600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26610 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
26620 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73   mmap() */..  as
26630 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
26640 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
26650 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d  ert( nNew>pFd->m
26660 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
26670 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e  ert( nNew<=pFd->
26680 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20  mmapSizeMax );. 
26690 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
266a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  );.  assert( pFd
266b0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
266c0 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  >=pFd->mmapSize 
266d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50  );.  assert( MAP
266e0 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 20  _FAILED!=0 );.. 
266f0 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
26700 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
26710 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
26720 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
26730 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29  ;..  if( pOrig )
26740 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
26750 73 7a 53 79 73 70 61 67 65 20 3d 20 75 6e 69 78  szSyspage = unix
26760 47 65 74 50 61 67 65 73 69 7a 65 28 29 3b 0a 20  GetPagesize();. 
26770 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
26780 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26  (pFd->mmapSize &
26790 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29   ~(szSyspage-1))
267a0 3b 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d  ;.    u8 *pReq =
267b0 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b   &pOrig[nReuse];
267c0 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61  ..    /* Unmap a
267d0 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ny pages of the 
267e0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
267f0 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20   that cannot be 
26800 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69  reused. */.    i
26810 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67  f( nReuse!=nOrig
26820 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
26830 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e  ap(pReq, nOrig-n
26840 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23  Reuse);.    }..#
26850 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
26860 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d     pNew = osMrem
26870 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
26880 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d  , nNew, MREMAP_M
26890 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72  AYMOVE);.    zEr
268a0 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65  r = "mremap";.#e
268b0 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  lse.    pNew = o
268c0 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77  sMmap(pReq, nNew
268d0 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20  -nReuse, flags, 
268e0 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e  MAP_SHARED, h, n
268f0 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Reuse);.    if( 
26900 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew!=MAP_FAILED
26910 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   ){.      if( pN
26920 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20  ew!=pReq ){.    
26930 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65      osMunmap(pNe
26940 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65  w, nNew - nReuse
26950 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
26960 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
26970 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  {.        pNew =
26980 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a   pOrig;.      }.
26990 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
269a0 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74    /* The attempt
269b0 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65   to extend the e
269c0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
269d0 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e  failed. Free it.
269e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77   */.    if( pNew
269f0 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20  ==MAP_FAILED || 
26a00 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
26a10 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c   osMunmap(pOrig,
26a20 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a   nReuse);.    }.
26a30 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65    }..  /* If pNe
26a40 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c  w is still NULL,
26a50 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
26a60 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d  n entirely new m
26a70 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  apping. */.  if(
26a80 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
26a90 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pNew = osMmap(0,
26aa0 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41   nNew, flags, MA
26ab0 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b  P_SHARED, h, 0);
26ac0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
26ad0 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
26ae0 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
26af0 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    nNew = 0;.    
26b00 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
26b10 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46  ITE_OK, zErr, pF
26b20 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20  d->zPath);..    
26b30 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29  /* If the mmap()
26b40 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61   above failed, a
26b50 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73  ssume that all s
26b60 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29  ubsequent mmap()
26b70 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69   calls.    ** wi
26b80 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c  ll probably fail
26b90 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20   too. Fall back 
26ba0 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  to using xRead/x
26bb0 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c  Write exclusivel
26bc0 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  y.    ** in this
26bd0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70   case.  */.    p
26be0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
26bf0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e  = 0;.  }.  pFd->
26c00 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f  pMapRegion = (vo
26c10 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64  id *)pNew;.  pFd
26c20 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64  ->mmapSize = pFd
26c30 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
26c40 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = nNew;.}../*.*
26c50 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
26c60 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
26c70 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
26c80 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
26c90 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
26ca0 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
26cb0 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
26cc0 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
26cd0 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
26ce0 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
26cf0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
26d00 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
26d10 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
26d20 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
26d30 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
26d40 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
26d50 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
26d60 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
26d70 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
26d80 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
26d90 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
26da0 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
26db0 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
26dc0 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
26dd0 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
26de0 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
26df0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
26e00 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
26e10 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
26e20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
26e30 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
26e40 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
26e50 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
26e60 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
26e70 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
26e80 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
26e90 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
26ea0 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
26eb0 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63  MMAP_LIMIT, whic
26ec0 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
26ed0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26ee0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
26ef0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
26f00 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
26f10 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
26f20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
26f30 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
26f40 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
26f50 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
26f60 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
26f70 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
26f80 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
26f90 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
26fa0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36  i64 nByte){.  i6
26fb0 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
26fc0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
26fd0 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
26fe0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
26ff0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
27000 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
27010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27020 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
27030 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
27040 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
27050 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
27060 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
27070 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   */.    rc = osF
27080 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
27090 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
270a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
270b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
270c0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
270d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
270e0 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
270f0 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
27100 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
27110 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
27120 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
27130 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  ax;.  }..  if( n
27140 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
27150 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d  ze ){.    if( nM
27160 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  ap>0 ){.      un
27170 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c  ixRemapfile(pFd,
27180 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73   nMap);.    }els
27190 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e 6d  e{.      unixUnm
271a0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20  apfile(pFd);.   
271b0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
271c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
271d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
271e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
271f0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
27200 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
27210 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
27220 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
27230 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
27240 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
27250 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
27260 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
27270 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
27280 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
27290 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
272a0 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
272b0 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
272c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
272d0 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
272e0 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
272f0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
27300 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
27310 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
27320 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
27330 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
27340 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
27350 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
27360 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
27370 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
27380 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
27390 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
273a0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
273b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
273c0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
273d0 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
273e0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
273f0 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e  ce by calling un
27400 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  ixUnfetch()..*/.
27410 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
27420 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
27430 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
27440 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20   int nAmt, void 
27450 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  **pp){.#if SQLIT
27460 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27470 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
27480 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
27490 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
274a0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
274b0 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
274c0 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20    *pp = 0;..#if 
274d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
274e0 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
274f0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
27500 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
27510 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
27520 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
27530 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c  unixMapfile(pFd,
27540 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
27550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27570 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
27580 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
27590 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
275a0 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
275b0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
275c0 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
275d0 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
275e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
275f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27600 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
27610 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
27620 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
27630 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
27640 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
27650 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
27660 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
27670 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68  all to unixFetch
27680 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
27690 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
276a0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
276b0 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
276c0 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
276d0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
276e0 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
276f0 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78  ssed to the unix
27700 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
27710 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  on. .**.** Or, i
27720 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
27730 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
27740 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27750 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
27760 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74   .** to inform t
27770 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
27780 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
27790 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
277a0 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  ing mapping .** 
277b0 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
277c0 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
277d0 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
277e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66  atic int unixUnf
277f0 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
27800 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
27810 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 75 6e 69   void *p){.  uni
27820 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
27830 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f  ixFile *)fd;   /
27840 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
27850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
27860 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
27870 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 23 69 66  ETER(iOff);..#if
27880 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27890 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20  _SIZE>0.  /* If 
278a0 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
278b0 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
278c0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
278d0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
278e0 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
278f0 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
27900 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
27910 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
27920 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
27930 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
27940 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
27950 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
27960 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
27970 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
27980 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
27990 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
279a0 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
279b0 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
279c0 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
279d0 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
279e0 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
279f0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
27a00 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
27a10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
27a20 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  ixUnmapfile(pFd)
27a30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
27a40 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
27a50 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  =0 );.#endif.  r
27a60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
27a80 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
27a90 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
27aa0 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
27ab0 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
27ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
27ad0 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
27ae0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
27af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b00 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
27b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b50 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
27b60 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
27b70 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
27b80 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
27b90 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
27ba0 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
27bb0 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
27bc0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
27bd0 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
27be0 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
27bf0 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
27c00 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
27c10 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
27c20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
27c30 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
27c40 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
27c50 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
27c60 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
27c70 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
27c80 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
27c90 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
27ca0 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
27cb0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
27cc0 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
27cd0 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
27ce0 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
27cf0 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
27d00 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
27d10 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
27d20 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27d30 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
27d40 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
27d50 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
27d60 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
27d70 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
27d80 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
27d90 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
27da0 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
27db0 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
27dc0 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
27dd0 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
27de0 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
27df0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
27e00 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74  der-funtion F, t
27e10 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
27e20 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
27e30 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
27e40 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
27e50 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
27e60 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
27e70 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
27e80 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
27e90 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
27ea0 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
27eb0 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
27ec0 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
27ed0 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
27ee0 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
27ef0 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
27f00 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
27f10 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
27f20 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
27f30 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
27f40 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
27f50 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
27f60 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
27f70 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
27f80 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
27f90 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
27fa0 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
27fb0 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
27fc0 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
27fd0 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
27fe0 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
27ff0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28000 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
28010 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
28020 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
28030 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
28040 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
28050 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
28060 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
28070 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
28080 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
28090 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
280a0 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
280b0 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
280c0 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
280d0 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
280e0 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
280f0 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e   METHOD, VERSION
28100 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
28110 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
28120 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
28130 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28140 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28170 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
281a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
282b0 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
282c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
282d0 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28300 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28320 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28350 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28370 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
283a0 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283c0 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
283f0 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
28400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28410 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
28440 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
28450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28460 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28470 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28480 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28490 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
284a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
284b0 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
284e0 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
284f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
28500 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28530 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
28540 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
28550 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
28560 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28570 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28580 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
28590 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
285a0 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
285d0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
285e0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
285f0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28620 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
28630 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
28640 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
28670 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
28680 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
28690 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68    \.   unixFetch
286c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
286d0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20     /* xFetch */ 
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63   \.   unixUnfetc
28710 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
28720 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
287a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
287b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
287c0 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
287d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
287e0 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
287f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28800 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
28810 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28840 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
288e0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
288f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
28900 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
28910 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
28920 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
28930 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
28940 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
28950 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
28960 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28970 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
28980 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
28990 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
289a0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
289b0 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
289c0 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
289d0 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
289e0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
289f0 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
28a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
28a10 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
28a20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
28a30 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
28a40 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
28a50 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28a60 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
28a90 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61  emory and mmap a
28aa0 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
28ab0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
28ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28ad0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
28ae0 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
28af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
28b00 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
28b10 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
28b20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
28b30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28b40 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
28b50 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68  dLock     /* xCh
28b60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28b70 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
28b80 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
28b90 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
28ba0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
28bb0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
28bc0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
28bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
28be0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28bf0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
28c00 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
28c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
28c20 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
28c30 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
28c40 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
28c50 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
28c60 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
28c70 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
28c80 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
28c90 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
28ca0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
28cb0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
28cc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
28cd0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
28ce0 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
28cf0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
28d00 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
28d10 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
28d20 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
28d30 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
28d40 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
28d50 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
28d60 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
28d70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28d80 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
28db0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
28dc0 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  bled */.  dotloc
28dd0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
28de0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
28df0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
28e00 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
28e10 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
28e20 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
28e30 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
28e40 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
28e50 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
28e60 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
28e70 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ck  /* xCheckRes
28e80 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
28e90 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
28ea0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28eb0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
28ec0 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
28ed0 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
28ee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
28ef0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
28f00 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
28f10 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
28f20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
28f30 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28f40 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f60 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
28f70 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
28f80 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
28f90 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28fa0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
28fb0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
28fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28fd0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
28fe0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
28ff0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29000 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
29010 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
29020 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
29030 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29040 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29050 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
29060 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
29070 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
29080 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
29090 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
290a0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
290b0 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
290c0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
290d0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
290e0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
290f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29100 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29110 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29120 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c  abled */.  semCl
29130 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29140 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29150 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
29160 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29170 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29180 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
29190 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
291a0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
291b0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
291c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
291d0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
291e0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
291f0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
29200 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
29210 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29220 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29230 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
29240 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
29250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29260 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29270 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
29280 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29290 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
292a0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
292b0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292d0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
292e0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
292f0 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29310 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29320 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29340 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29350 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29370 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29380 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
29390 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
293a0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
293b0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
293c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
293d0 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
293e0 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
293f0 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
29400 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
29410 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
29420 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
29430 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
29440 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
29450 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
29460 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
29470 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
29480 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
29490 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
294a0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
294b0 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
294c0 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
294d0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
294e0 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
294f0 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
29500 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
29510 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
29520 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
29530 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
29540 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
29550 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
29560 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
29570 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
29580 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
29590 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
295a0 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
295b0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
295c0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
295d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
295e0 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
295f0 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
29600 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
29610 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
29620 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
29630 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
29640 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
29650 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
29660 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
29670 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
29680 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
29690 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
296a0 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
296b0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
296c0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
296d0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
296e0 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
296f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
29700 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29710 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29720 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29740 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29750 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72  disabled */.  pr
29760 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
29770 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29780 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
29790 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
297a0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
297b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
297c0 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
297d0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
297e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
297f0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
29800 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
29810 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29820 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29830 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
29840 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
29850 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
29860 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
29870 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
29880 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
29890 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
298a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
298b0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
298c0 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
298e0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
298f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
29900 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29910 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
29920 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29930 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29960 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29970 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
29980 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29990 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
299a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
299b0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
299c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
299d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
299e0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
299f0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29a00 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
29a10 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
29a20 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
29a30 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29a40 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
29a50 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
29a60 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
29a70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29a80 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
29a90 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
29aa0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
29ab0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
29ac0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
29ad0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
29ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29af0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
29b00 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
29b10 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
29b20 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
29b30 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
29b40 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
29b50 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
29b60 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
29b70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
29b80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29b90 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
29ba0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
29bb0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
29bc0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
29bd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29be0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
29bf0 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
29c00 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
29c10 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
29c20 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
29c30 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
29c40 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
29c50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
29c60 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
29c70 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
29c80 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
29c90 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
29ca0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
29cb0 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
29cc0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
29cd0 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
29ce0 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
29cf0 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
29d00 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
29d10 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
29d20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
29d30 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
29d40 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
29d50 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
29d60 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
29d70 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
29d80 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
29d90 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
29da0 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
29db0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
29dc0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
29dd0 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
29de0 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
29df0 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
29e00 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
29e10 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
29e20 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
29e30 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
29e40 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
29e50 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
29e60 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
29e70 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
29e80 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
29e90 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
29ea0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
29eb0 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
29ec0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
29ed0 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
29ee0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
29ef0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
29f00 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
29f10 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
29f20 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
29f30 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
29f40 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
29f50 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
29f60 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
29f70 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
29f80 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
29f90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
29fa0 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
29fb0 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
29fc0 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
29fd0 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
29fe0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
29ff0 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2a000 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2a010 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2a020 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2a030 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2a040 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2a050 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2a060 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2a070 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2a080 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2a090 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2a0a0 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2a0b0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2a0c0 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2a0d0 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2a0e0 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2a0f0 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2a100 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2a110 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2a120 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a130 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2a140 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2a150 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2a160 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2a170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2a180 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2a190 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2a1a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a1b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2a1c0 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2a1d0 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2a1e0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2a1f0 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2a200 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2a210 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2a220 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2a230 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a240 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2a250 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
2a260 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2a270 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
2a280 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2a290 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
2a2a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2a2b0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
2a2c0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
2a2d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a2e0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
2a2f0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
2a300 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2a310 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
2a320 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2a330 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
2a340 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
2a350 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
2a360 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2a370 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a380 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2a390 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2a3a0 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2a3b0 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2a3c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a3d0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2a3e0 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2a3f0 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
2a400 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
2a410 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2a420 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2a430 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2a440 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2a450 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2a460 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2a470 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2a480 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2a490 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2a4a0 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2a4b0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2a4c0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
2a4d0 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
2a4e0 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
2a4f0 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
2a500 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
2a510 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
2a520 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
2a530 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
2a540 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
2a550 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2a560 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2a570 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2a580 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2a590 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2a5a0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2a5b0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2a5c0 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2a5d0 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2a5e0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
2a5f0 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2a600 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2a610 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
2a620 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
2a630 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2a640 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
2a650 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
2a660 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
2a670 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2a680 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
2a690 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2a6a0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2a6b0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2a6c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2a6d0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2a6e0 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2a6f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
2a700 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
2a710 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
2a720 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
2a730 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
2a740 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
2a750 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2a760 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
2a770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a7b0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2a7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a7d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2a7e0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2a7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a800 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
2a810 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
2a820 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2a830 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
2a840 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
2a850 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
2a860 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2a870 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a880 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2a890 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
2a8a0 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
2a8b0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
2a8c0 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
2a8d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2a8e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2a8f0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2a900 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
2a910 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2a920 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2a930 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
2a940 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
2a950 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
2a960 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
2a970 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
2a980 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2a990 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2a9a0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
2a9b0 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
2a9c0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
2a9d0 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
2a9e0 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
2a9f0 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
2aa00 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
2aa10 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2aa20 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
2aa30 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
2aa40 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
2aa50 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
2aa60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aa70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
2aa80 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
2aa90 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  );..  /* Usually
2aaa0 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e   the path zFilen
2aab0 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ame should not b
2aac0 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  e a relative pat
2aad0 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20  hname. The.  ** 
2aae0 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
2aaf0 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72  n opening the pr
2ab00 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65  oxy "conch" file
2ab10 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a   in builds that.
2ab20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65    ** include the
2ab30 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c   special Apple l
2ab40 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20  ocking styles.. 
2ab50 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2ab60 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2ab70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ab80 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65  ING_STYLE.  asse
2ab90 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
2aba0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
2abb0 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56  =='/' .    || pV
2abc0 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76  fs->pAppData==(v
2abd0 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
2abe0 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a  Finder );.#else.
2abf0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2ac00 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
2ac10 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23  ame[0]=='/' );.#
2ac20 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  endif..  /* No l
2ac30 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
2ac40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2ac50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
2ac60 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
2ac70 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2ac80 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
2ac90 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
2aca0 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
2acb0 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
2acc0 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
2acd0 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
2ace0 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
2acf0 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2ad00 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
2ad10 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c  ags = (u8)ctrlFl
2ad20 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ags;.#if SQLITE_
2ad30 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
2ad40 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65    pNew->mmapSize
2ad50 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
2ad60 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
2ad70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  ;.#endif.  if( s
2ad80 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2ad90 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26  an(((ctrlFlags &
2ada0 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f   UNIXFILE_URI) ?
2adb0 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c   zFilename : 0),
2adc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2add0 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f              "pso
2ade0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
2adf0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
2ae00 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
2ae10 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2ae20 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69  LE_PSOW;.  }.  i
2ae30 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e  f( strcmp(pVfs->
2ae40 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c  zName,"unix-excl
2ae50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ")==0 ){.    pNe
2ae60 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2ae70 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
2ae80 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
2ae90 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
2aea0 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
2aeb0 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
2aec0 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
2aed0 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61  0 ){.    ctrlFla
2aee0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
2aef0 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  OLOCK;.    rc = 
2af00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2af10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
2af20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
2af30 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20  FILE_NOLOCK ){. 
2af40 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2af50 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
2af60 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2af70 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
2af80 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
2af90 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
2afa0 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
2afb0 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
2afc0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2afd0 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
2afe0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
2aff0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
2b000 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
2b010 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
2b020 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
2b030 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
2b040 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
2b050 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
2b060 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
2b070 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
2b080 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
2b090 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
2b0a0 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
2b0b0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2b0c0 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
2b0d0 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
2b0e0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
2b0f0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2b100 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
2b110 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2b120 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2b130 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2b140 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
2b150 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
2b160 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
2b170 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
2b180 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2b190 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2b1a0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2b1b0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2b1c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b1d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2b1e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2b1f0 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d in findInodeIn
2b200 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
2b210 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2b220 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
2b230 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
2b240 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
2b250 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  . findInodeInfo(
2b260 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20  ) may fail.     
2b270 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61   ** in two scena
2b280 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  rios:.      **. 
2b290 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20       **   (a) A 
2b2a0 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20  call to fstat() 
2b2b0 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
2b2c0 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20     (b) A malloc 
2b2d0 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
2b2e0 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72  .      ** Scenar
2b2f0 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20  io (b) may only 
2b300 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f  occur if the pro
2b310 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
2b320 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  no other.      *
2b330 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
2b340 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  rs open on the s
2b350 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ame file. If the
2b360 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69  re were other fi
2b370 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
2b380 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20  riptors on this 
2b390 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61  file, then no ma
2b3a0 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65  lloc would be re
2b3b0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2b3c0 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  ** findInodeInfo
2b3d0 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  (). If this is t
2b3e0 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71  he case, it is q
2b3f0 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  uite safe to clo
2b400 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
2b410 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20  le h - as it is 
2b420 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
2b430 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77  no posix locks w
2b440 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a  ill be released.
2b450 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e        ** by doin
2b460 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  g so..      **. 
2b470 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61       ** If scena
2b480 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74  rio (a) caused t
2b490 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68  he error then th
2b4a0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20  ings are not so 
2b4b0 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20  safe. The.      
2b4c0 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75  ** implicit assu
2b4d0 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74  mption here is t
2b4e0 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66  hat if fstat() f
2b4f0 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65  ails, things are
2b500 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63   in.      ** suc
2b510 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74  h bad shape that
2b520 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b   dropping a lock
2b530 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20   or two doesn't 
2b540 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20  matter much..   
2b550 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
2b560 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2b570 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2b580 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     h = -1;.    }
2b590 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2b5a0 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  tex();.  }..#if 
2b5b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b5c0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2b5d0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2b5e0 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ).  else if( pLo
2b5f0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61  ckingStyle == &a
2b600 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
2b610 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e     /* AFP lockin
2b620 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2b630 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2b640 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
2b650 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66  in.    ** the af
2b660 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e  pLockingContext.
2b670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c  .    */.    afpL
2b680 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2b690 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  Ctx;.    pNew->l
2b6a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2b6b0 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
2b6c0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
2b6d0 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Ctx) );.    if( 
2b6e0 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pCtx==0 ){.     
2b6f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2b700 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2b710 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c       /* NB: zFil
2b720 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64  ename exists and
2b730 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
2b740 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73  ntil the file is
2b750 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a   closed.      **
2b760 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65   according to re
2b770 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31  quirement F11141
2b780 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20  .  So we do not 
2b790 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20  need to make a. 
2b7a0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
2b7b0 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f  the filename. */
2b7c0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50  .      pCtx->dbP
2b7d0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
2b7e0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73  .      pCtx->res
2b7f0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  erved = 0;.     
2b800 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
2b810 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75       unixEnterMu
2b820 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20  tex();.      rc 
2b830 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2b840 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2b850 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
2b860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b880 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b  _free(pNew->lock
2b890 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
2b8a0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
2b8b0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2b8c0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20  E__);.        h 
2b8d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
2b8e0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2b8f0 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20  ex();        .  
2b900 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2b910 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2b920 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74  ingStyle == &dot
2b930 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
2b940 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20  .    /* Dotfile 
2b950 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
2b960 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
2b970 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
2b980 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
2b990 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
2b9a0 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  ngContext .    *
2b9b0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63  /.    char *zLoc
2b9c0 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e  kFile;.    int n
2b9d0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73  Filename;.    as
2b9e0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21  sert( zFilename!
2b9f0 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  =0 );.    nFilen
2ba00 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
2ba10 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
2ba20 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
2ba30 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
2ba40 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
2ba50 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
2ba60 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
2ba70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2ba80 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
2ba90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2baa0 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
2bab0 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
2bac0 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
2bad0 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
2bae0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
2baf0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2bb00 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
2bb10 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2bb20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2bb30 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
2bb40 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2bb50 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
2bb60 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
2bb70 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2bb80 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
2bb90 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
2bba0 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
2bbb0 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
2bbc0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2bbd0 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2bbe0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2bbf0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2bc00 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
2bc10 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
2bc20 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2bc30 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
2bc40 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
2bc50 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
2bc60 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
2bc70 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
2bc80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2bc90 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
2bca0 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
2bcb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bcc0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
2bcd0 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
2bce0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
2bcf0 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
2bd00 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
2bd10 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
2bd20 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
2bd30 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
2bd40 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2bd50 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
2bd60 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
2bd70 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
2bd80 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
2bd90 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
2bda0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
2bdb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2bdc0 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
2bdd0 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
2bde0 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
2bdf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2be00 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2be10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2be20 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
2be30 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
2be40 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
2be50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2be60 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
2be70 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2be80 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2be90 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55   h = -1;.    osU
2bea0 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
2beb0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  ;.    pNew->ctrl
2bec0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2bed0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65  E_DELETE;.  }.#e
2bee0 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
2bef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bf00 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2bf10 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2bf20 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65   __LINE__);.  }e
2bf30 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
2bf40 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e  Method = pLockin
2bf50 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e  gStyle;.    Open
2bf60 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20  Counter(+1);.   
2bf70 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e   verifyDbFile(pN
2bf80 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ew);.  }.  retur
2bf90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2bfa0 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
2bfb0 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
2bfc0 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
2bfd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
2bfe0 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
2bff0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2c000 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
2c010 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
2c020 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
2c030 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
2c040 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
2c050 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2c060 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
2c070 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
2c080 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
2c090 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
2c0a0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
2c0b0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
2c0c0 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
2c0d0 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
2c0e0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2c0f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
2c100 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
2c110 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
2c120 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
2c130 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2c140 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61  ectory;.  if( !a
2c150 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2c160 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[1] = getenv("S
2c170 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
2c180 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d    if( !azDirs[2]
2c190 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67   ) azDirs[2] = g
2c1a0 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
2c1b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
2c1c0 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
2c1d0 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
2c1e0 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
2c1f0 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
2c200 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c210 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
2c220 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
2c230 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
2c240 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
2c250 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
2c260 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
2c270 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
2c280 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
2c290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
2c2a0 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
2c2b0 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
2c2c0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
2c2d0 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
2c2e0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
2c2f0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
2c300 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
2c310 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
2c320 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
2c330 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c340 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
2c350 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
2c360 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
2c370 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2c380 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
2c390 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
2c3a0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
2c3b0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2c3c0 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
2c3d0 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
2c3e0 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
2c3f0 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
2c400 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
2c410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2c420 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
2c430 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2c440 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2c450 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2c460 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2c470 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2c480 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2c490 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2c4a0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2c4b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2c4c0 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
2c4d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2c4e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2c4f0 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
2c500 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2c510 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
2c520 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
2c530 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2c540 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
2c550 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
2c560 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
2c570 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
2c580 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
2c590 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
2c5a0 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
2c5b0 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
2c5c0 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
2c5d0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
2c5e0 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69  IX) + 18) >= (si
2c5f0 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
2c600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2c610 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
2c620 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2c630 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
2c640 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
2c650 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2c660 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
2c670 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
2c680 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
2c690 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
2c6a0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
2c6b0 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
2c6c0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
2c6d0 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
2c6e0 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
2c6f0 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
2c700 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
2c710 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
2c720 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zBuf[j] = 0;.   
2c730 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
2c740 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
2c750 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
2c760 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c770 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
2c780 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c790 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2c7a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
2c7b0 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
2c7c0 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
2c7d0 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
2c7e0 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
2c7f0 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
2c800 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
2c810 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
2c820 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
2c830 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
2c840 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2c850 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
2c860 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2c870 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
2c880 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
2c890 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
2c8a0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
2c8b0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
2c8c0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2c8d0 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
2c8e0 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
2c8f0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
2c900 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
2c910 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
2c920 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
2c930 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
2c940 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
2c950 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
2c960 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
2c970 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2c980 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
2c990 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
2c9a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
2c9b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c9c0 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
2c9d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2c9e0 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
2c9f0 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
2ca00 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
2ca10 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
2ca20 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
2ca30 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
2ca40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2ca50 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2ca60 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
2ca70 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
2ca80 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
2ca90 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
2caa0 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
2cab0 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
2cac0 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
2cad0 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
2cae0 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
2caf0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
2cb00 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
2cb10 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
2cb20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
2cb30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
2cb40 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
2cb50 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
2cb60 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
2cb70 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
2cb80 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
2cb90 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
2cba0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2cbb0 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
2cbc0 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
2cbd0 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
2cbe0 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
2cbf0 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
2cc00 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2cc10 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
2cc20 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
2cc30 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
2cc40 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
2cc50 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
2cc60 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
2cc70 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
2cc80 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
2cc90 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
2cca0 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
2ccb0 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
2ccc0 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
2ccd0 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
2cce0 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
2ccf0 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
2cd00 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
2cd10 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
2cd20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
2cd30 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
2cd40 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
2cd50 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
2cd60 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2cd70 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
2cd80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
2cd90 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
2cda0 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
2cdb0 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
2cdc0 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
2cdd0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
2cde0 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
2cdf0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
2ce00 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
2ce10 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
2ce20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
2ce30 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
2ce40 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
2ce50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
2ce60 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
2ce70 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
2ce80 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
2ce90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
2cea0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
2ceb0 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
2cec0 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
2ced0 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
2cee0 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
2cef0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2cf00 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
2cf10 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
2cf20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
2cf30 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
2cf40 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
2cf50 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
2cf60 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
2cf70 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
2cf80 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
2cf90 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
2cfa0 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
2cfb0 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
2cfc0 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
2cfd0 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
2cfe0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2cff0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
2d000 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
2d010 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
2d020 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
2d030 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
2d040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d050 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
2d060 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
2d070 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
2d080 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
2d090 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
2d0a0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
2d0b0 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
2d0c0 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
2d0d0 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
2d0e0 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
2d0f0 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
2d100 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
2d110 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
2d120 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
2d130 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
2d140 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
2d150 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
2d160 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2d170 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2d180 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
2d190 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
2d1a0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
2d1b0 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
2d1c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2d1d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2d1e0 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
2d1f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
2d200 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
2d210 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
2d220 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
2d230 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2d240 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
2d250 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
2d260 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
2d270 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
2d280 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
2d290 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
2d2a0 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
2d2b0 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
2d2c0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
2d2d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2d2e0 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
2d2f0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2d300 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
2d310 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
2d320 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73  *.** In most cas
2d330 65 73 20 63 61 73 65 73 2c 20 74 68 69 73 20 72  es cases, this r
2d340 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f  outine sets *pMo
2d350 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77  de to 0, which w
2d360 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e  ill become.** an
2d370 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72   indication to r
2d380 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20  obust_open() to 
2d390 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20  create the file 
2d3a0 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
2d3b0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2d3c0 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65  MISSIONS adjuste
2d3d0 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
2d3e0 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69  ** But if the fi
2d3f0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2d400 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
2d410 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2d420 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
2d430 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
2d440 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2d450 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
2d460 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
2d470 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
2d480 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2d490 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
2d4a0 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
2d4b0 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
2d4c0 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
2d4d0 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
2d4e0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
2d4f0 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
2d500 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
2d510 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2d520 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2d530 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2d540 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
2d550 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2d560 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
2d570 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
2d580 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
2d590 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
2d5a0 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
2d5b0 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
2d5c0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
2d5d0 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
2d5e0 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
2d5f0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
2d600 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
2d610 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
2d620 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
2d630 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d650 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
2d660 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
2d670 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
2d680 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2d690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2d6a0 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
2d6b0 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
2d6c0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
2d6d0 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
2d6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d6f0 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
2d700 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
2d710 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  h */.  uid_t *pU
2d720 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2d730 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
2d740 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2d750 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
2d760 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2d770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2d780 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: gid to set on
2d790 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
2d7a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d7b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2d7c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2d7d0 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30   */.  *pMode = 0
2d7e0 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20  ;.  *pUid = 0;. 
2d7f0 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66   *pGid = 0;.  if
2d800 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2d810 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2d820 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2d830 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
2d840 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
2d850 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
2d860 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
2d870 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d890 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d8a0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
2d8b0 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
2d8c0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2d8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2d8e0 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
2d8f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2d900 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
2d910 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
2d920 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
2d930 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
2d940 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
2d950 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
2d960 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
2d970 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
2d980 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
2d990 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
2d9a0 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
2d9b0 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
2d9c0 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
2d9d0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2d9e0 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
2d9f0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2da00 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
2da10 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2da20 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
2da30 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2da40 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
2da50 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
2da60 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e  N is a decimal n
2da70 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
2da80 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
2da90 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
2daa0 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
2dab0 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
2dac0 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
2dad0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2dae0 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64  Path) - 1; .#ifd
2daf0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2db00 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77  _8_3_NAMES.    w
2db10 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73  hile( nDb>0 && s
2db20 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50  qlite3Isalnum(zP
2db30 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d  ath[nDb]) ) nDb-
2db40 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
2db50 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 || zPath[nDb]!
2db60 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='-' ) return SQ
2db70 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
2db80 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
2db90 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
2dba0 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30     assert( nDb>0
2dbb0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2dbc0 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c  ( zPath[nDb]!='\
2dbd0 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d  n' );.      nDb-
2dbe0 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  -;.    }.#endif.
2dbf0 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
2dc00 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
2dc10 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
2dc20 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
2dc30 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
2dc40 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
2dc50 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
2dc60 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20  e & 0777;.      
2dc70 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
2dc80 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69  _uid;.      *pGi
2dc90 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64  d = sStat.st_gid
2dca0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2dcb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2dcc0 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
2dcd0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
2dce0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2dcf0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
2dd00 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2dd10 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  0600;.  }.  retu
2dd20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2dd30 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
2dd40 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
2dd50 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
2dd60 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
2dd70 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2dd80 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
2dd90 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
2dda0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2ddb0 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
2ddc0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2ddd0 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
2dde0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2ddf0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
2de00 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
2de10 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
2de20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
2de30 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
2de40 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
2de50 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
2de60 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2de70 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
2de80 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
2de90 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
2dea0 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
2deb0 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
2dec0 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
2ded0 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
2dee0 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
2def0 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
2df00 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
2df10 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
2df20 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
2df30 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
2df40 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
2df50 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
2df60 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
2df70 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
2df80 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
2df90 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
2dfa0 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
2dfb0 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
2dfc0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
2dfd0 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
2dfe0 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
2dff0 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
2e000 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
2e010 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
2e020 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2e030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2e040 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
2e050 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
2e060 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
2e070 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2e080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e090 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
2e0a0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
2e0b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
2e0c0 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
2e0d0 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
2e0e0 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
2e0f0 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
2e100 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2e110 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
2e120 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
2e130 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
2e140 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e160 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
2e170 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
2e180 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e core */.){.  u
2e190 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
2e1a0 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ixFile *)pFile;.
2e1b0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20    int fd = -1;  
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1d0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2e1e0 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
2e1f0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2e200 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
2e210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2e220 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
2e230 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
2e240 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
2e250 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
2e260 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
2e270 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  n */.  int noLoc
2e280 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2e290 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2e2a0 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72   omit locking pr
2e2b0 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e  imitives */.  in
2e2c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2e2e0 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
2e2f0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74  Code */.  int ct
2e300 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  rlFlags = 0;    
2e310 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58           /* UNIX
2e320 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
2e330 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
2e340 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
2e350 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
2e360 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
2e370 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
2e380 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2e390 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
2e3a0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
2e3b0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
2e3c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2e3d0 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
2e3e0 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
2e3f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2e400 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
2e410 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
2e420 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2e430 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
2e440 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2e450 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2e460 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
2e470 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2e480 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
2e490 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
2e4a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2e4b0 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
2e4c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2e4d0 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
2e4e0 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
2e4f0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
2e500 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
2e510 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
2e520 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2e530 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
2e540 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
2e550 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
2e560 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
2e570 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
2e580 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
2e590 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
2e5a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
2e5b0 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
2e5c0 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
2e5d0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
2e5e0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
2e5f0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
2e600 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2e610 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2e620 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2e630 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2e640 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
2e650 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2e660 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
2e670 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
2e680 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
2e690 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
2e6a0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
2e6b0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
2e6c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
2e6d0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
2e6e0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
2e6f0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
2e700 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
2e710 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a  AX_PATHNAME+2];.
2e720 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2e730 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
2e740 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
2e750 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
2e760 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
2e770 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
2e780 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
2e790 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
2e7a0 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
2e7b0 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
2e7c0 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
2e7d0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
2e7e0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
2e7f0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
2e800 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
2e810 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
2e820 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2e830 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2e840 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
2e850 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
2e860 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
2e870 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
2e880 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
2e890 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
2e8a0 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
2e8b0 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
2e8c0 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
2e8d0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
2e8e0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
2e8f0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
2e900 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
2e910 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
2e920 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
2e930 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
2e940 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
2e950 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
2e960 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
2e970 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
2e980 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
2e990 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2e9a0 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
2e9b0 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
2e9c0 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
2e9d0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2e9e0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2e9f0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2ea00 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
2ea10 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2ea20 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2ea30 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2ea40 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2ea50 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
2ea60 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
2ea70 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
2ea80 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2ea90 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2eaa0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2eab0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2eac0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2ead0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
2eae0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
2eaf0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
2eb00 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
2eb10 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
2eb20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2eb30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2eb40 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
2eb50 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2eb60 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
2eb70 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2eb80 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2eb90 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2eba0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
2ebb0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2ebc0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ebd0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
2ebe0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2ebf0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
2ec00 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
2ec10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ec20 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
2ec30 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2ec40 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
2ec50 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2ec60 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
2ec70 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
2ec80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2ec90 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
2eca0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2ecb0 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
2ecc0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
2ecd0 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
2ece0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2ecf0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
2ed00 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
2ed10 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
2ed20 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
2ed30 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
2ed40 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
2ed50 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
2ed60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ed70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2ed80 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
2ed90 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
2eda0 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ..    /* Databas
2edb0 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
2edc0 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
2edd0 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
2ede0 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52  re not.    ** UR
2edf0 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
2ee00 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
2ee10 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
2ee20 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a  assed into.    *
2ee30 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  * sqlite3_uri_pa
2ee40 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
2ee50 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
2ee60 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
2ee70 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72  RI) || zName[str
2ee80 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30  len(zName)+1]==0
2ee90 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28   );..  }else if(
2eea0 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f   !zName ){.    /
2eeb0 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55  * If zName is NU
2eec0 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  LL, the upper la
2eed0 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e  yer is requestin
2eee0 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a  g a temp file. *
2eef0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44  /.    assert(isD
2ef00 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69  elete && !syncDi
2ef10 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69  r);.    rc = uni
2ef20 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58  xGetTempname(MAX
2ef30 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d  _PATHNAME+2, zTm
2ef40 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
2ef50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ef60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2ef70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
2ef80 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20  e = zTmpname;.. 
2ef90 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20     /* Generated 
2efa0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
2efb0 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64  mes are always d
2efc0 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
2efd0 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72  nated.    ** for
2efe0 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f   use by sqlite3_
2eff0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
2f000 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2f010 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
2f020 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d  me)+1]==0 );.  }
2f030 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
2f040 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2f050 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2f060 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
2f070 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
2f080 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
2f090 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
2f0a0 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
2f0b0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
2f0c0 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
2f0d0 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
2f0e0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
2f0f0 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
2f100 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
2f110 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
2f120 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
2f130 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
2f140 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
2f150 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
2f160 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
2f170 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
2f180 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
2f190 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
2f1a0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
2f1b0 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
2f1c0 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
2f1d0 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
2f1e0 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
2f1f0 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
2f200 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
2f210 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
2f220 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
2f230 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
2f240 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
2f250 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
2f260 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69  e with */.    ui
2f270 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20  d_t uid;        
2f280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2f290 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69  serid for the fi
2f2a0 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20  le */.    gid_t 
2f2b0 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
2f2c0 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70          /* Group
2f2d0 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
2f2e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  */.    rc = find
2f2f0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
2f300 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
2f310 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
2f320 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
2f330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f340 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
2f350 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  pUnused );.     
2f360 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
2f370 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
2f380 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f390 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f3a0 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
2f3b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2f3c0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2f3d0 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
2f3e0 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
2f3f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
2f400 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
2f410 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
2f420 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
2f430 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
2f440 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
2f450 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
2f460 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
2f470 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
2f480 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
2f490 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2f4a0 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
2f4b0 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
2f4c0 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
2f4d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2f4e0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2f4f0 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
2f500 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
2f510 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
2f520 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2f530 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2f540 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
2f550 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
2f560 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
2f570 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75  .      fd = robu
2f580 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2f590 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2f5a0 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
2f5b0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
2f5c0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2f5d0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2f5e0 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
2f5f0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
2f600 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
2f610 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
2f620 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   If this process
2f630 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   is running as r
2f640 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74  oot and if creat
2f650 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61  ing a new rollba
2f660 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  ck.    ** journa
2f670 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73  l or WAL file, s
2f680 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70  et the ownership
2f690 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2f6a0 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20  or WAL to be.   
2f6b0 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20   ** the same as 
2f6c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
2f6d0 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
2f6e0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
2f6f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
2f700 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2f710 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
2f720 20 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 20 75    osFchown(fd, u
2f730 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a  id, gid);.    }.
2f740 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
2f750 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
2f760 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
2f770 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
2f780 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
2f790 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
2f7a0 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
2f7b0 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
2f7c0 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
2f7d0 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
2f7e0 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
2f7f0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
2f800 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73  th = zName;.#els
2f810 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a  e.    osUnlink(z
2f820 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
2f830 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
2f840 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2f850 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
2f860 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
2f870 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
2f880 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65  if..  noLock = e
2f890 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2f8a0 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23  N_MAIN_DB;..  .#
2f8b0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2f8c0 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2f8d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2f8e0 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
2f8f0 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
2f900 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75  == -1 ){.    ((u
2f910 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
2f920 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2f930 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  no;.    robust_c
2f940 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2f950 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
2f960 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2f970 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
2f980 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
2f990 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
2f9a0 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
2f9b0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2f9c0 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
2f9d0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
2f9e0 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
2f9f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
2fa00 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  et up appropriat
2fa10 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20  e ctrlFlags */. 
2fa20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20   if( isDelete ) 
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2fa40 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2fa50 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69  FILE_DELETE;.  i
2fa60 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2fa80 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2fa90 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28  LE_RDONLY;.  if(
2faa0 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20   noLock )       
2fab0 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2fac0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2fad0 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73  _NOLOCK;.  if( s
2fae0 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20  yncDir )        
2faf0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2fb00 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
2fb10 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c  IRSYNC;.  if( fl
2fb20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2fb30 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67  N_URI ) ctrlFlag
2fb40 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52  s |= UNIXFILE_UR
2fb50 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  I;..#if SQLITE_E
2fb60 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2fb70 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
2fb80 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2fb90 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
2fba0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
2fbb0 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
2fbc0 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
2fbd0 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
2fbe0 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
2fbf0 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
2fc00 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
2fc10 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2fc20 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
2fc30 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
2fc40 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
2fc50 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2fc60 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
2fc70 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
2fc80 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
2fc90 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
2fca0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
2fcb0 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
2fcc0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
2fcd0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
2fce0 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
2fcf0 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
2fd00 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
2fd10 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
2fd20 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66  .      if( statf
2fd30 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  s(zPath, &fsInfo
2fd40 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  ) == -1 ){.     
2fd50 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
2fd60 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63   the close(fd) c
2fd70 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d  all is sub-optim
2fd80 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  al. If the file 
2fd90 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  opened.        *
2fda0 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64  * with fd is a d
2fdb0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
2fdc0 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  d there are othe
2fdd0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70  r connections op
2fde0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
2fdf0 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
2fe00 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f  are currently ho
2fe10 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c  lding advisory l
2fe20 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20  ocks on it,.    
2fe30 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2fe40 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20  call to close() 
2fe50 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73  will cancel thos
2fe60 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63  e locks. In prac
2fe70 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tice,.        **
2fe80 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
2fe90 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f  that statfs() do
2fea0 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20  esn't fail very 
2feb0 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a  often. At least.
2fec0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77          ** not w
2fed0 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20  hile other file 
2fee0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
2fef0 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ed by the same p
2ff00 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20  rocess on.      
2ff10 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69    ** the same fi
2ff20 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20  le are working. 
2ff30 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   */.        p->l
2ff40 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2ff50 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
2ff60 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
2ff70 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2ff80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2ff90 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20  RR_ACCESS;.     
2ffa0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2ffb0 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ished;.      }. 
2ffc0 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
2ffd0 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
2ffe0 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
2fff0 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
30000 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
30010 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
30020 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
30030 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
30040 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
30050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30060 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
30070 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
30080 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
30090 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
300a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
300b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
300c0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
300d0 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
300e0 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
300f0 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
30100 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
30110 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
30120 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
30130 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
30140 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
30150 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
30160 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
30170 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
30180 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
30190 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
301a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
301b0 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
301c0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
301d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
301e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
301f0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
30200 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
30210 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
30220 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
30230 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
30240 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
30250 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69  Flags);..open_fi
30260 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
30270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30280 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30290 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d  p->pUnused);.  }
302a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
302b0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
302c0 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
302d0 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
302e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
302f0 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
30300 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
30310 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
30320 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
30330 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
30340 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
30350 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
30360 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
30370 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
30380 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
30390 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
303a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
303b0 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
303c0 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
303d0 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
303e0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
303f0 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
30400 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
30410 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
30420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30430 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
30440 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30450 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
30460 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
30470 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
30480 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
30490 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  th)==(-1) ){.   
304a0 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45   if( errno==ENOE
304b0 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NT ){.      rc =
304c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
304d0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20  LETE_NOENT;.    
304e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
304f0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
30500 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
30510 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
30520 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
30530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
30540 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
30550 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
30560 69 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31  if( (dirSync & 1
30570 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
30580 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  fd;.    rc = osO
30590 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
305a0 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66  th, &fd);.    if
305b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
305c0 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
305d0 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  S.      if( fsyn
305e0 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73  c(fd)==-1 ).#els
305f0 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  e.      if( fsyn
30600 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20  c(fd) ).#endif. 
30610 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72       {.        r
30620 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
30630 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  (SQLITE_IOERR_DI
30640 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22  R_FSYNC, "fsync"
30650 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
30660 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  }.      robust_c
30670 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
30680 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
30690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
306a0 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
306b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
306c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
306d0 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
306e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
306f0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f  e existence of o
30700 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
30710 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
30720 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
30730 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
30740 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
30750 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
30760 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
30770 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
30780 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
30790 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
307a0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
307b0 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
307c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
307d0 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
307e0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
307f0 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
30800 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
30810 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
30820 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
30830 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
30840 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
30850 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
30860 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f  fs *NotUsed,   /
30870 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69  * The VFS contai
30880 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73  ning this xAcces
30890 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  s method */.  co
308a0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
308b0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
308c0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61   the file to exa
308d0 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  mine */.  int fl
308e0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
308f0 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20    /* What do we 
30900 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62  want to learn ab
30910 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69  out the zPath fi
30920 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  le? */.  int *pR
30930 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
30940 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
30950 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f   boolean here */
30960 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20  .){.  int amode 
30970 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
30980 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
30990 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
309a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
309b0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
309c0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   );.  switch( fl
309d0 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
309e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
309f0 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
30a00 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
30a10 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
30a20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
30a30 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
30a40 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
30a50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30a60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
30a70 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
30a80 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
30a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
30aa0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
30ab0 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
30ac0 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
30ad0 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
30ae0 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a  ut = (osAccess(z
30af0 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29  Path, amode)==0)
30b00 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53  ;.  if( flags==S
30b10 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
30b20 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20  STS && *pResOut 
30b30 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
30b40 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20  at buf;.    if( 
30b50 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
30b60 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74   &buf) && buf.st
30b70 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _size==0 ){.    
30b80 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
30b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
30ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30bb0 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
30bc0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
30bd0 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
30be0 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
30bf0 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
30c00 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
30c10 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
30c20 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
30c30 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
30c40 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
30c50 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
30c60 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
30c70 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
30c80 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
30c90 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
30ca0 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
30cb0 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
30cc0 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
30cd0 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
30ce0 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
30cf0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
30d00 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
30d10 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
30d20 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
30d30 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
30d40 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
30d50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
30d60 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
30d70 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
30d80 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
30d90 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30db0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
30dc0 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
30dd0 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
30de0 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
30df0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
30e00 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a  t buffer */.){..
30e10 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
30e20 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
30e30 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
30e40 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
30e50 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
30e60 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
30e70 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
30e80 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
30e90 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
30ea0 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
30eb0 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
30ec0 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
30ed0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
30ee0 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
30ef0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
30f00 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
30f10 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
30f20 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
30f30 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
30f40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  ;..  assert( pVf
30f50 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d  s->mxPathname==M
30f60 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20  AX_PATHNAME );. 
30f70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30f80 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74  R(pVfs);..  zOut
30f90 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b  [nOut-1] = '\0';
30fa0 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
30fb0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  ='/' ){.    sqli
30fc0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
30fd0 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
30fe0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
30ff0 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20      int nCwd;.  
31000 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a    if( osGetcwd(z
31010 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20  Out, nOut-1)==0 
31020 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
31030 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
31040 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
31050 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61  T, "getcwd", zPa
31060 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  th);.    }.    n
31070 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Cwd = (int)strle
31080 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  n(zOut);.    sql
31090 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
310a0 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e  ut-nCwd, &zOut[n
310b0 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61  Cwd], "/%s", zPa
310c0 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  th);.  }.  retur
310d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
310e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
310f0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
31100 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
31110 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
31120 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
31130 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
31140 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
31150 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
31160 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
31170 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
31180 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
31190 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
311a0 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
311b0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
311c0 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
311d0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
311e0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
311f0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31200 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
31210 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
31220 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
31230 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
31240 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
31250 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
31260 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
31270 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
31280 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
31290 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
312a0 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
312b0 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
312c0 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
312d0 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
312e0 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
312f0 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
31300 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
31310 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
31320 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
31330 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
31340 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
31350 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
31360 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
31370 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
31380 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
31390 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
313a0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
313b0 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ut){.  const cha
313c0 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45  r *zErr;.  UNUSE
313d0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
313e0 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  sed);.  unixEnte
313f0 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
31400 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
31410 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
31420 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31430 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
31440 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
31450 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
31460 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
31470 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73  id (*unixDlSym(s
31480 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31490 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  sed, void *p, co
314a0 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
314b0 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  void){.  /* .  *
314c0 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61  * GCC with -peda
314d0 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73  ntic-errors says
314e0 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e   that C90 does n
314f0 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a  ot allow a void*
31500 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74   to be.  ** cast
31510 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
31520 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
31530 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72  And yet the libr
31540 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74  ary dlsym() rout
31550 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ine.  ** returns
31560 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69   a void* which i
31570 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74  s really a point
31580 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
31590 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a  .  So how do we.
315a0 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29    ** use dlsym()
315b0 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
315c0 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a  errors?.  **.  *
315d0 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c  * Variable x bel
315e0 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ow is defined to
315f0 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
31600 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69   a function taki
31610 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  ng.  ** paramete
31620 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e  rs void* and con
31630 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74  st char* and ret
31640 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  urning a pointer
31650 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a   to a function..
31660 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69    ** We initiali
31670 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e  ze x by assignin
31680 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74  g it a pointer t
31690 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75  o the dlsym() fu
316a0 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68  nction..  ** (Th
316b0 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65  at assignment re
316c0 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20  quires a cast.) 
316d0 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68   Then we call th
316e0 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  e function that.
316f0 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f    ** x points to
31700 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
31710 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  is work-around i
31720 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f  s unlikely to wo
31730 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  rk correctly on 
31740 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65  any system where
31750 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79  .  ** you really
31760 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66   cannot cast a f
31770 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
31780 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74  into void*.  But
31790 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20   then, on the.  
317a0 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64  ** other hand, d
317b0 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20  lsym() will not 
317c0 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73  work on such a s
317d0 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f  ystem either, so
317e0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f   we have.  ** no
317f0 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e  t really lost an
31800 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76  ything..  */.  v
31810 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a  oid (*(*x)(void*
31820 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
31830 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  oid);.  UNUSED_P
31840 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31850 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a  );.  x = (void(*
31860 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  (*)(void*,const 
31870 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c  char*))(void))dl
31880 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a  sym;.  return (*
31890 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  x)(p, zSym);.}.s
318a0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
318b0 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
318c0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
318d0 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
318e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
318f0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
31900 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
31910 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
31920 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
31930 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
31940 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
31950 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
31960 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
31970 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
31980 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
31990 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
319a0 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
319b0 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
319c0 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
319d0 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
319e0 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
319f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
31a00 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
31a10 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
31a20 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
31a30 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
31a40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31a50 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
31a60 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
31a70 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
31a80 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
31a90 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
31aa0 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
31ab0 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
31ac0 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
31ad0 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
31ae0 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
31af0 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
31b00 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
31b10 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
31b20 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
31b30 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
31b40 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
31b50 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
31b60 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
31b70 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
31b80 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
31b90 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
31ba0 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
31bb0 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
31bc0 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
31bd0 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
31be0 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
31bf0 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
31c00 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
31c10 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
31c20 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
31c30 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
31c40 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
31c50 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
31c60 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
31c70 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
31c80 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
31c90 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
31ca0 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
31cb0 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
31cc0 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
31cd0 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
31ce0 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
31cf0 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
31d00 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
31d10 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64  0, nBuf);.#if !d
31d20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
31d30 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ST).  {.    int 
31d40 70 69 64 2c 20 66 64 2c 20 67 6f 74 3b 0a 20 20  pid, fd, got;.  
31d50 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
31d60 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
31d70 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b  ", O_RDONLY, 0);
31d80 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
31d90 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
31da0 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
31db0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
31dc0 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
31dd0 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
31de0 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
31df0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
31e00 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73  eof(t)], &pid, s
31e10 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
31e20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
31e30 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29  f(t)+sizeof(pid)
31e40 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
31e50 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
31e60 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
31e70 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pid);.    }els
31e80 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74  e{.      do{ got
31e90 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42   = osRead(fd, zB
31ea0 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c  uf, nBuf); }whil
31eb0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
31ec0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
31ed0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
31ee0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
31ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
31f00 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b  f.  return nBuf;
31f10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
31f20 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
31f30 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
31f40 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
31f50 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72  slept..** The ar
31f60 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75  gument is the nu
31f70 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
31f80 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20  onds we want to 
31f90 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65  sleep..** The re
31fa0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
31fb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
31fc0 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65  oseconds of slee
31fd0 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  p actually.** re
31fe0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
31ff0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
32000 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20  ating system, a 
32010 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20  number which.** 
32020 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72  might be greater
32030 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
32040 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  o the argument, 
32050 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20  but not less.** 
32060 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  than the argumen
32070 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
32080 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74   unixSleep(sqlit
32090 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
320a0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
320b0 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  s){.#if OS_VXWOR
320c0 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
320d0 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74  spec sp;..  sp.t
320e0 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63  v_sec = microsec
320f0 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a  onds / 1000000;.
32100 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28    sp.tv_nsec = (
32110 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31  microseconds % 1
32120 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a  000000) * 1000;.
32130 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c    nanosleep(&sp,
32140 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44   NULL);.  UNUSED
32150 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32160 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
32170 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69  croseconds;.#eli
32180 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
32190 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
321a0 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
321b0 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20  icroseconds);.  
321c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
321d0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
321e0 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
321f0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65  ;.#else.  int se
32200 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65  conds = (microse
32210 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30  conds+999999)/10
32220 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73  00000;.  sleep(s
32230 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
32240 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32250 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  sed);.  return s
32260 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a  econds*1000000;.
32270 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
32280 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
32290 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
322a0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
322b0 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
322c0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
322d0 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
322e0 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
322f0 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
32300 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
32310 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
32320 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
32330 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
32340 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
32350 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
32360 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
32370 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
32380 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
32390 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
323a0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
323b0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
323c0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
323d0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
323e0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
323f0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
32400 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
32410 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
32420 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
32430 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
32440 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
32450 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
32460 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
32470 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
32480 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
32490 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
324a0 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
324b0 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
324c0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
324d0 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
324e0 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
324f0 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
32500 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
32510 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
32520 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
32530 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a   time and date .
32540 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
32550 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
32560 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
32570 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
32580 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c  fs *NotUsed, sql
32590 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
325a0 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  w){.  static con
325b0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
325c0 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
325d0 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
325e0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20  nt64)8640000;.  
325f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32600 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  OK;.#if defined(
32610 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d  NO_GETTOD).  tim
32620 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
32630 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28  );.  *piNow = ((
32640 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29  sqlite3_int64)t)
32650 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63  *1000 + unixEpoc
32660 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f  h;.#elif OS_VXWO
32670 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
32680 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c  espec sNow;.  cl
32690 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43  ock_gettime(CLOC
326a0 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f  K_REALTIME, &sNo
326b0 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75  w);.  *piNow = u
326c0 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
326d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
326e0 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
326f0 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30  w.tv_nsec/100000
32700 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  0;.#else.  struc
32710 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
32720 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64    if( gettimeofd
32730 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20  ay(&sNow, 0)==0 
32740 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
32750 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
32760 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
32770 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
32780 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
32790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
327a0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
327b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
327c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
327d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
327e0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
327f0 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
32800 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
32810 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
32820 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
32830 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
32840 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32850 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
32860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
32870 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
32880 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
32890 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
328a0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
328b0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
328c0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
328d0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
328e0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
328f0 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
32900 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
32910 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
32920 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
32930 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32940 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
32950 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32960 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
32970 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
32980 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
32990 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
329a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
329b0 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
329c0 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
329d0 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
329e0 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
329f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32a00 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
32a10 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
32a20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
32a30 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
32a40 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
32a50 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
32a60 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
32a70 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
32a80 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
32a90 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
32aa0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
32ab0 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
32ac0 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
32ad0 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
32ae0 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
32af0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32b00 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
32b10 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
32b20 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
32b30 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
32b40 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
32b50 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
32b60 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
32b70 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
32b80 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
32b90 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32ba0 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
32bb0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32bc0 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
32bd0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32be0 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
32bf0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
32c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32c10 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
32c20 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
32c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32c40 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
32c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32c90 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
32ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ce0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
32cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32d00 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
32d10 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
32d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32d30 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
32d40 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
32d50 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
32d60 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
32d70 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
32d80 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
32d90 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
32da0 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
32db0 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
32dc0 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
32dd0 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
32de0 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
32df0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
32e00 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
32e10 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
32e20 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
32e30 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
32e40 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
32e50 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
32e60 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
32e70 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
32e80 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
32e90 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
32ea0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
32eb0 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
32ec0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
32ed0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
32ee0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
32ef0 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
32f00 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
32f10 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
32f20 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
32f30 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
32f40 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
32f50 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
32f60 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
32f70 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
32f80 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
32f90 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
32fa0 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
32fb0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
32fc0 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
32fd0 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
32fe0 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
32ff0 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
33000 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
33010 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
33020 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
33030 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
33040 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
33050 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
33060 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
33070 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
33080 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
33090 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
330a0 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
330b0 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
330c0 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
330d0 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
330e0 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
330f0 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
33100 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
33110 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
33120 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
33130 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
33140 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
33150 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
33160 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
33170 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
33180 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
33190 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
331a0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
331b0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
331c0 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
331d0 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
331e0 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
331f0 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
33200 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
33210 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
33220 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45  000.**      RESE
33230 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
33240 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
33250 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
33260 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33270 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
33280 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
33290 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
332a0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
332b0 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
332c0 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
332d0 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
332e0 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
332f0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
33300 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
33310 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
33320 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
33330 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
33340 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
33350 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
33360 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
33370 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
33380 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
33390 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
333a0 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
333b0 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
333c0 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
333d0 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
333e0 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
333f0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
33400 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
33410 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
33420 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
33430 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
33440 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
33450 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
33460 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
33470 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
33480 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
33490 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
334a0 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
334b0 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
334c0 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
334d0 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
334e0 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
334f0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
33500 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
33510 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
33520 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
33530 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
33540 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
33550 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
33560 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
33570 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
33580 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
33590 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
335a0 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
335b0 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
335c0 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
335d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
335e0 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
335f0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
33600 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
33610 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
33620 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
33630 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
33640 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
33650 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
33660 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
33670 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
33680 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
33690 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336b0 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
336c0 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
336d0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
336e0 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
336f0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
33700 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78  ROXYFILE, &<prox
33710 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
33720 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
33730 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
33740 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
33750 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
33760 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
33770 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
33780 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
33790 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
337a0 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
337b0 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
337c0 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
337d0 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
337e0 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
337f0 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
33800 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
33810 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
33820 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
33830 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
33840 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
33850 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
33860 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
33870 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
33880 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
33890 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
338a0 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
338b0 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
338c0 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
338d0 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
338e0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
338f0 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
33900 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
33910 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
33920 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
33930 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
33940 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
33950 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
33960 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
33970 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
33980 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
33990 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
339a0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
339b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
339c0 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
339d0 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
339e0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
339f0 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
33a00 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
33a10 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
33a20 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
33a30 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
33a40 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
33a50 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
33a60 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
33a70 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
33a80 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
33a90 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
33aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33ab0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
33ac0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
33ad0 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
33ae0 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
33af0 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
33b00 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
33b10 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
33b20 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
33b30 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
33b40 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
33b50 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
33b60 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
33b70 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
33b80 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
33b90 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
33ba0 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
33bb0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
33bc0 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
33bd0 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
33be0 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
33bf0 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
33c00 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
33c10 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
33c20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
33c30 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
33c40 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
33c50 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
33c60 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
33c70 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
33c80 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
33c90 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
33ca0 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
33cb0 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
33cc0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
33cd0 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
33ce0 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
33cf0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
33d00 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
33d10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33d20 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
33d30 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
33d40 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
33d50 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
33d60 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
33d70 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
33d80 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
33d90 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
33da0 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e  , or it's conten
33db0 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  ts do not match 
33dc0 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61  the.** host ID a
33dd0 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68  nd/or proxy path
33de0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
33df0 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20  is escalated to 
33e00 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  an exclusive.** 
33e10 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e  lock and the con
33e20 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73  ch file contents
33e30 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
33e40 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
33e50 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61   proxy.** path a
33e60 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64  nd the lock is d
33e70 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73  owngraded to a s
33e80 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e  hared lock again
33e90 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a  .  If the conch.
33ea0 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e  ** is held by an
33eb0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77  other process (w
33ec0 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ith a shared loc
33ed0 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76  k), the exclusiv
33ee0 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66  e lock.** will f
33ef0 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ail and SQLITE_B
33f00 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
33f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
33f20 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65   file - a single
33f30 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20  -byte file used 
33f40 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79  for all advisory
33f50 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e   file locks.** n
33f60 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e  ormally taken on
33f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33f80 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77  le.   This allow
33f90 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69  s for safe shari
33fa0 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ng.** of the dat
33fb0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d  abase file for m
33fc0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
33fd0 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74  and writers on t
33fe0 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20  he same.** host 
33ff0 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72  (the conch ensur
34000 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c  es that they all
34010 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f   use the same lo
34020 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a  cal lock file)..
34030 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67  **.** Requesting
34040 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20   the lock proxy 
34050 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61  does not immedia
34060 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f  tely take the co
34070 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e  nch, it is.** on
34080 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  ly taken when th
34090 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20  e first request 
340a0 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65  to lock database
340b0 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20   file is made.  
340c0 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73  .** This matches
340d0 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f   the semantics o
340e0 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  f the traditiona
340f0 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69  l locking behavi
34100 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65  or, where.** ope
34110 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ning a connectio
34120 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
34130 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61  file does not ta
34140 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e  ke a lock on it.
34150 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c  .** The shared l
34160 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20  ock and an open 
34170 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
34180 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75  are maintained u
34190 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ntil .** the con
341a0 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
341b0 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65  atabase is close
341c0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  d. .**.** The pr
341d0 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65  oxy file and the
341e0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e   lock file are n
341f0 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20  ever deleted so 
34200 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a  they only need.*
34210 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  * to be created 
34220 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
34230 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  hey are used..**
34240 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
34250 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d  n options.** ---
34260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34270 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  --.**.**  SQLITE
34280 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
34290 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CKING.**.**     
342a0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73    Database files
342b0 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e   accessed on non
342c0 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74  -local file syst
342d0 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  ems are.**      
342e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
342f0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72  onfigured for pr
34300 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63  oxy locking, loc
34310 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20  k files are.**  
34320 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d       named autom
34330 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74  atically using t
34340 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73  he same logic as
34350 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41  .**       PRAGMA
34360 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
34370 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20  =":auto:".**    
34380 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58  .**  SQLITE_PROX
34390 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20  Y_DEBUG.**.**   
343a0 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20      Enables the 
343b0 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72  logging of error
343c0 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67   messages during
343d0 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a   host id file.**
343e0 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c         retrieval
343f0 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a   and creation.**
34400 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49  .**  LOCKPROXYDI
34410 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76  R.**.**       Ov
34420 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61  errides the defa
34430 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73  ult directory us
34440 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78  ed for lock prox
34450 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20  y files that.** 
34460 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20        are named 
34470 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69  automatically vi
34480 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73  a the ":auto:" s
34490 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51  etting.**.**  SQ
344a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
344b0 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
344c0 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65  S.**.**       Pe
344d0 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65  rmissions to use
344e0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
344f0 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73   directory for s
34500 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  toring the.**   
34510 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66      lock proxy f
34520 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20  iles, only used 
34530 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49  when LOCKPROXYDI
34540 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a  R is not set..**
34550 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41      .**    .** A
34560 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76  s mentioned abov
34570 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  e, when compiled
34580 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45   with SQLITE_PRE
34590 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
345a0 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68  G,.** setting th
345b0 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
345c0 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f  riable SQLITE_FO
345d0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
345e0 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66  G to 1 will.** f
345f0 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69  orce proxy locki
34600 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ng to be used fo
34610 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  r every database
34620 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e   file opened, an
34630 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63  d 0.** will forc
34640 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78  e automatic prox
34650 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
34660 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c  disabled for all
34670 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
34680 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61  es (explicity ca
34690 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
346a0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
346b0 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
346c0 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
346d0 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
346e0 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
346f0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
34700 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
34710 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
34720 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
34730 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
34740 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
34750 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
34760 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
34770 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
34780 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
34790 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
347a0 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
347b0 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
347c0 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
347d0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
347e0 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
347f0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
34800 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
34810 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
34820 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
34830 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
34840 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
34850 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
34860 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
34870 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
34880 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
34890 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
348a0 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
348b0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
348c0 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
348d0 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
348e0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
348f0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
34900 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
34910 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
34920 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
34930 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
34940 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
34950 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
34960 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
34970 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
34980 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
34990 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
349a0 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
349b0 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
349c0 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
349d0 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
349e0 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
349f0 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
34a00 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
34a10 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
34a20 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
34a30 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
34a40 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
34a50 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
34a60 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
34a70 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
34a80 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
34a90 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
34aa0 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
34ab0 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
34ac0 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
34ad0 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
34ae0 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
34af0 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
34b00 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
34b10 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
34b20 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
34b30 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
34b40 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
34b50 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
34b60 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
34b70 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
34b80 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
34b90 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
34ba0 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
34bb0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
34bc0 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
34bd0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
34be0 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
34bf0 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
34c00 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
34c10 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
34c20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
34c30 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
34c40 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
34c50 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
34c60 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
34c70 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69  th, errno, getpi
34c80 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  d()));.      ret
34c90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
34ca0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
34cb0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
34cc0 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
34cd0 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
34ce0 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
34cf0 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
34d00 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
34d10 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
34d20 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
34d30 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
34d40 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
34d50 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
34d60 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
34d70 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
34d80 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
34d90 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
34da0 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
34db0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
34dc0 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
34dd0 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
34de0 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
34df0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
34e00 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
34e10 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
34e20 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
34e30 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
34e40 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
34e50 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
34e60 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
34e70 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
34e80 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
34e90 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
34ea0 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65  %d\n", lPath, ge
34eb0 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
34ec0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34ed0 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
34ee0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
34ef0 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
34f00 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
34f10 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
34f20 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
34f30 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
34f40 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
34f50 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
34f60 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
34f70 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
34f80 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
34f90 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
34fa0 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
34fb0 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
34fc0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
34fd0 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
34fe0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
34ff0 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
35000 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
35010 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
35020 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
35030 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
35040 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
35050 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
35060 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
35070 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
35080 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
35090 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
350a0 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
350b0 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
350c0 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
350d0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
350e0 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
350f0 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
35100 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
35110 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
35120 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
35130 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
35140 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  ';.        if( o
35150 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49  sMkdir(buf, SQLI
35160 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
35170 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
35180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
35190 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
351a0 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
351b0 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
351c0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
351d0 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
351e0 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
351f0 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
35200 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
35210 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
35220 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35240 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
35250 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
35260 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
35270 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
35280 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
35290 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
352a0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
352b0 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
352c0 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
352d0 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
352e0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
352f0 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
35300 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
35310 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65  n", lockPath, ge
35320 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75  tpid()));.  retu
35330 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
35340 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
35350 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35360 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
35370 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
35380 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
35390 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
353a0 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
353b0 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
353c0 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
353d0 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
353e0 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
353f0 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
35400 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
35410 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
35420 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
35430 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
35440 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
35450 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
35460 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
35470 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
35480 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
35490 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
354a0 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
354b0 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
354c0 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
354d0 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
354e0 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
354f0 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
35500 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
35510 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
35520 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
35530 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
35540 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
35550 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
35560 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
35570 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
35580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
35590 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
355a0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
355b0 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
355c0 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
355d0 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
355e0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
355f0 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
35600 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
35610 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
35620 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
35630 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
35640 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
35650 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
35660 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
35670 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
35680 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
35690 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
356a0 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
356b0 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
356c0 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
356d0 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
356e0 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
356f0 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
35700 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
35710 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
35720 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
35730 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
35740 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
35750 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
35760 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
35770 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
35780 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
35790 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
357a0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
357b0 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
357c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
357d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
357e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
357f0 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62   ){.    fd = rob
35800 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
35810 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
35820 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
35830 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26  ;.    if( fd<0 &
35840 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  & errno==ENOENT 
35850 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b  && islockfile ){
35860 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79  .      if( proxy
35870 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70  CreateLockPath(p
35880 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f  ath) == SQLITE_O
35890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20  K ){.        fd 
358a0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
358b0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
358c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
358d0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
358e0 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
358f0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
35900 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
35910 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
35920 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e  s, 0);.    terrn
35930 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
35940 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
35950 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
35960 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
35970 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
35980 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
35990 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
359a0 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
359b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
359c0 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
359d0 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
359e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
359f0 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
35a00 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
35a10 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
35a20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
35a30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35a40 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
35a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
35a60 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
35a70 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
35a80 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
35a90 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
35aa0 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
35ab0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
35ac0 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
35ad0 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
35ae0 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
35af0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
35b00 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
35b10 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
35b20 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56    memset(&dummyV
35b30 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  fs, 0, sizeof(du
35b40 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d  mmyVfs));.  dumm
35b50 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
35b60 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
35b70 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d  IoFinder;.  dumm
35b80 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75  yVfs.zName = "du
35b90 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d  mmy";.  pUnused-
35ba0 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75  >fd = fd;.  pUnu
35bb0 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65  sed->flags = ope
35bc0 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  nFlags;.  pNew->
35bd0 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
35be0 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  d;.  .  rc = fil
35bf0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
35c00 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69  myVfs, fd, (sqli
35c10 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20  te3_file*)pNew, 
35c20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20  path, 0);.  if( 
35c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35c40 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
35c50 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
35c60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
35c70 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
35c80 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c      .  robust_cl
35c90 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f  ose(pNew, fd, __
35ca0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74  LINE__);.  sqlit
35cb0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
35cc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
35cd0 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  nused);.  return
35ce0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
35cf0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69  QLITE_TEST./* si
35d00 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
35d10 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
35d20 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
35d30 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e  file paths */.in
35d40 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
35d50 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  _num = 0;.#endif
35d60 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ..#define PROXY_
35d70 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20  HOSTIDLEN    16 
35d80 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
35d90 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f  ost id length */
35da0 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20  ../* Not always 
35db0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68  defined in the h
35dc0 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67  eaders as it oug
35dd0 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65  ht to be */.exte
35de0 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75  rn int gethostuu
35df0 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f  id(uuid_t id, co
35e00 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
35e10 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20  pec *wait);../* 
35e20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
35e30 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
35e40 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
35e50 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
35e60 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
35e70 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
35e80 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
35e90 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
35ea0 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
35eb0 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
35ec0 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65  *pError){.  asse
35ed0 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
35ee0 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
35ef0 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
35f00 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
35f10 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
35f20 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f  f defined(__MAX_
35f30 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
35f40 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20  _REQUIRED)\.    
35f50 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f             && __
35f60 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
35f70 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30  _MIN_REQUIRED<10
35f80 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  50.  {.    stati
35f90 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  c const struct t
35fa0 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
35fb0 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
35fc0 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
35fd0 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
35fe0 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
35ff0 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
36000 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
36010 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
36020 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
36030 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
36040 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
36050 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
36060 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
36070 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36080 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
36090 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
360a0 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
360b0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
360c0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
360d0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
360e0 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
360f0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
36100 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
36110 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
36120 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
36130 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
36140 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
36150 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
36160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36170 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
36180 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
36190 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
361a0 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
361b0 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
361c0 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
361d0 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
361e0 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
361f0 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
36200 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
36210 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
36220 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
36230 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
36240 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
36250 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
36260 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
36270 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
36280 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
36290 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
362a0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
362b0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
362c0 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
362d0 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
362e0 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
362f0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
36300 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
36310 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
36320 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
36330 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
36340 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
36350 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
36360 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
36370 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
36380 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
36390 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
363a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
363b0 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
363c0 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
363d0 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
363e0 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
363f0 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
36400 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
36410 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
36420 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36430 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
36440 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36450 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
36460 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
36470 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36480 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36490 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
364a0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
364b0 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
364c0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
364d0 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
364e0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
364f0 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
36500 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
36510 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
36520 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
36530 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
36540 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
36550 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
36560 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
36570 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
36580 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
36590 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
365a0 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
365b0 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
365c0 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
365d0 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
365e0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
365f0 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
36600 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
36610 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
36620 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
36630 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
36640 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
36650 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
36660 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
36670 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
36680 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
36690 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
366a0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
366b0 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
366c0 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
366d0 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
366e0 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
366f0 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
36700 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
36710 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
36720 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
36730 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
36740 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
36750 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
36760 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
36770 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
36780 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
36790 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
367a0 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
367b0 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
367c0 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
367d0 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
367e0 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
367f0 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
36800 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 66  CL), 0);.  if( f
36810 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d<0 ){.    sqlit
36820 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36830 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
36840 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
36850 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
36860 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
36870 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
36880 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c  if( osPwrite(fd,
36890 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30   buf, readLen, 0
368a0 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65  ) != (ssize_t)re
368b0 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  adLen ){.    sql
368c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
368d0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
368e0 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69  rmsg, "write fai
368f0 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
36900 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
36910 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
36920 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74   if( rename(tPat
36930 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20  h, cPath) ){.   
36940 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36950 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
36960 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  , errmsg, "renam
36970 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
36980 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
36990 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
369a0 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
369b0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
369c0 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
369d0 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
369e0 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f  h);.  robust_clo
369f0 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46  se(pFile, conchF
36a00 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
36a10 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  );.  conchFile->
36a20 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46  h = fd;.  conchF
36a30 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  ile->openFlags =
36a40 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
36a50 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  T;..end_breakloc
36a60 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  k:.  if( rc ){. 
36a70 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
36a80 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74        osUnlink(t
36a90 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62  Path);.      rob
36aa0 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
36ab0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
36ac0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
36ad0 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65  f(stderr, "faile
36ae0 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65  d to break stale
36af0 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c   lock on %s, %s\
36b00 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73  n", cPath, errms
36b10 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
36b20 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20   rc;.}../* Take 
36b30 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
36b40 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20  ck on the conch 
36b50 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61  file and break a
36b60 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74   stale lock if t
36b70 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d  he .** host id m
36b80 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  atches..*/.stati
36b90 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68  c int proxyConch
36ba0 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
36bb0 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
36bc0 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54  ostID, int lockT
36bd0 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ype){.  proxyLoc
36be0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
36bf0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
36c00 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
36c10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36c20 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
36c30 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
36c40 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e  >conchFile;.  in
36c50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36c60 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d  ;.  int nTries =
36c70 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d   0;.  struct tim
36c80 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69  espec conchModTi
36c90 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  me;.  .  memset(
36ca0 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30  &conchModTime, 0
36cb0 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f  , sizeof(conchMo
36cc0 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a  dTime));.  do {.
36cd0 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
36ce0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
36cf0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
36d00 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
36d10 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69  kType);.    nTri
36d20 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72  es ++;.    if( r
36d30 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
36d40 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
36d50 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
36d60 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
36d70 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
36d80 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
36d90 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
36da0 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
36db0 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
36dc0 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
36dd0 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
36de0 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
36df0 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
36e00 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
36e10 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
36e20 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
36e30 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
36e40 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
36e50 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
36e60 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
36e70 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
36e80 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
36e90 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63  if( osFstat(conc
36ea0 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  hFile->h, &buf) 
36eb0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
36ec0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
36ed0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rno;.        ret
36ee0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
36ef0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
36f00 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
36f10 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20  nTries==1 ){.   
36f20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
36f30 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65  e = buf.st_mtime
36f40 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73  spec;.        us
36f50 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a  leep(500000); /*
36f60 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e   wait 0.5 sec an
36f70 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61  d try the lock a
36f80 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63  gain*/.        c
36f90 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
36fa0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
36fb0 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20  ( nTries>1 );.  
36fc0 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64      if( conchMod
36fd0 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62  Time.tv_sec != b
36fe0 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e  uf.st_mtimespec.
36ff0 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20  tv_sec || .     
37000 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
37010 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e  .tv_nsec != buf.
37020 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
37030 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nsec ){.        
37040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
37050 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SY;.      }.    
37060 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37070 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20  ies==2 ){  .    
37080 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52      char tBuf[PR
37090 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
370a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  ;.        int le
370b0 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
370c0 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20  hFile->h, tBuf, 
370d0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
370e0 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  N, 0);.        i
370f0 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  f( len<0 ){.    
37100 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
37110 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
37120 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
37130 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37140 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  CK;.        }.  
37150 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52        if( len>PR
37160 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26  OXY_PATHINDEX &&
37170 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29   tBuf[0]==(char)
37180 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
37190 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ON){.          /
371a0 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
371b0 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f  e lock if the ho
371c0 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61  st id doesn't ma
371d0 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
371e0 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26   if( 0!=memcmp(&
371f0 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  tBuf[PROXY_HEADE
37200 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
37210 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
37220 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
37230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37240 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
37250 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
37260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
37270 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
37280 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20  k on short read 
37290 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73  or a version mis
372a0 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
372b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
372c0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
372d0 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
372e0 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  10000000); /* wa
372f0 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72  it 10 sec and tr
37300 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
37310 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
37320 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20  inue; .      }. 
37330 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65       .      asse
37340 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b  rt( nTries==3 );
37350 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72  .      if( 0==pr
37360 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
37370 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
37380 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  D) ){.        rc
37390 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
373a0 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79        if( lockTy
373b0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
373c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
373d0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
373e0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
373f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
37400 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
37410 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20  LOCK);          
37420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37430 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
37440 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
37450 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37460 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
37470 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
37480 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37490 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
374a0 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72    }.  } while( r
374b0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
374c0 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20  & nTries<3 );.  
374d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
374e0 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f  ./* Takes the co
374f0 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20  nch by taking a 
37500 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
37510 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
37520 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20  s conch, if .** 
37530 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d  lockPath is non-
37540 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49  NULL, the host I
37550 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  D and lock file 
37560 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e  path must match.
37570 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63    A NULL .** loc
37580 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74  kPath means that
37590 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e   the lockPath in
375a0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
375b0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20  will be used if 
375c0 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73  the .** host IDs
375d0 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77   match, or a new
375e0 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
375f0 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74  be generated aut
37600 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61  omatically .** a
37610 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  nd written to th
37620 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f  e conch file..*/
37630 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37640 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46  yTakeConch(unixF
37650 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70  ile *pFile){.  p
37660 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37670 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
37680 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37690 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
376a0 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69  Context; .  .  i
376b0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
376c0 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ld!=0 ){.    ret
376d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
376e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78   }else{.    unix
376f0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
37700 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
37710 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79  e;.    uuid_t my
37720 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20  HostID;.    int 
37730 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pError = 0;.    
37740 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f  char readBuf[PRO
37750 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37760 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61  .    char lockPa
37770 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
37780 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f      char *tempLo
37790 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ckPath = NULL;. 
377a0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
377b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63  TE_OK;.    int c
377c0 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a  reateConch = 0;.
377d0 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61      int hostIdMa
377e0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tch = 0;.    int
377f0 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
37800 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b    int tryOldLock
37810 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Path = 0;.    in
37820 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61  t forceNewLockPa
37830 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20  th = 0;.    .   
37840 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43   OSTRACE(("TAKEC
37850 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20  ONCH  %d for %s 
37860 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68  pid=%d\n", conch
37870 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
37880 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63        (pCtx->loc
37890 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74  kProxyPath ? pCt
378a0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
378b0 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
378c0 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72  tpid()));..    r
378d0 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74  c = proxyGetHost
378e0 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45  ID(myHostID, &pE
378f0 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rror);.    if( (
37900 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
37910 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20  _IOERR ){.      
37920 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
37930 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20   = pError;.     
37940 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
37950 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nch;.    }.    r
37960 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  c = proxyConchLo
37970 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
37980 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ID, SHARED_LOCK)
37990 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
379a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
379b0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
379c0 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nch;.    }.    /
379d0 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74  * read the exist
379e0 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  ing conch file *
379f0 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20  /.    readLen = 
37a00 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69  seekAndRead((uni
37a10 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  xFile*)conchFile
37a20 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52  , 0, readBuf, PR
37a30 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29  OXY_MAXCONCHLEN)
37a40 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65  ;.    if( readLe
37a50 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
37a60 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45  I/O error: lastE
37a70 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
37a80 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20  AndRead */.     
37a90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
37aa0 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c  o = conchFile->l
37ab0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
37ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
37ad0 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f  R_READ;.      go
37ae0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
37af0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37b00 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f  readLen<=(PROXY_
37b10 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
37b20 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20  HOSTIDLEN) || . 
37b30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
37b40 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52  Buf[0]!=(char)PR
37b50 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
37b60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73   ){.      /* a s
37b70 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72  hort read or ver
37b80 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d  sion format mism
37b90 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65  atch means we ne
37ba0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
37bb0 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ew .      ** con
37bc0 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  ch file. .      
37bd0 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43  */.      createC
37be0 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  onch = 1;.    }.
37bf0 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f      /* if the ho
37c00 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e  st id matches an
37c10 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  d the lock path 
37c20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
37c30 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20  n the conch.    
37c40 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20  ** we'll try to 
37c50 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65  use the path the
37c60 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20  re, if we can't 
37c70 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20  open that path, 
37c80 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65  we'll .    ** re
37c90 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61  try with a new a
37ca0 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61  uto-generated pa
37cb0 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  th .    */.    d
37cc0 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77  o { /* in case w
37cd0 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67  e need to try ag
37ce0 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f  ain for an :auto
37cf0 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c  : named lock fil
37d00 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  e */..      if( 
37d10 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20  !createConch && 
37d20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74  !forceNewLockPat
37d30 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73  h ){.        hos
37d40 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63  tIdMatch = !memc
37d50 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58  mp(&readBuf[PROX
37d60 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79  Y_HEADERLEN], my
37d70 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20  HostID, .       
37d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d90 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59             PROXY
37da0 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20  _HOSTIDLEN);.   
37db0 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63       /* if the c
37dc0 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f  onch has data co
37dd0 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
37de0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ts */.        if
37df0 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
37e00 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
37e10 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d      /* for auto-
37e20 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b  named local lock
37e30 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63   file, just chec
37e40 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  k the host ID an
37e50 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20  d we'll.        
37e60 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f     ** use the lo
37e70 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
37e80 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64  th that's alread
37e90 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20  y in there.     
37ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37eb0 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
37ec0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
37ed0 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
37ee0 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52   = (readLen - PR
37ef0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a  OXY_PATHINDEX);.
37f00 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
37f10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74           if( pat
37f20 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e  hLen>=MAXPATHLEN
37f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
37f40 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54    pathLen=MAXPAT
37f50 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20  HLEN-1;.        
37f60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
37f70 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74    memcpy(lockPat
37f80 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
37f90 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61  Y_PATHINDEX], pa
37fa0 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  thLen);.        
37fb0 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74      lockPath[pat
37fc0 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  hLen] = 0;.     
37fd0 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50         tempLockP
37fe0 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a  ath = lockPath;.
37ff0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4f              tryO
38000 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a  ldLockPath = 1;.
38010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
38020 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
38030 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66  the lock path if
38040 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61   the conch is ta
38050 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
38060 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
38070 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20  conch;.         
38080 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
38090 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68   if( hostIdMatch
380a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
380b0 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78  && !strncmp(pCtx
380c0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
380d0 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f   &readBuf[PROXY_
380e0 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20  PATHINDEX],.    
380f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38100 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50         readLen-P
38110 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a  ROXY_PATHINDEX).
38120 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
38130 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f       /* conch ho
38140 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68  st and lock path
38150 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
38160 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
38170 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20  econch; .       
38180 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
38190 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68   .      /* if th
381a0 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72  e conch isn't wr
381b0 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e  itable and doesn
381c0 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e  't match, we can
381d0 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20  't take it */.  
381e0 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69      if( (conchFi
381f0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f  le->openFlags&O_
38200 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20  RDWR) == 0 ){.  
38210 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
38220 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
38230 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
38240 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
38250 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68    .      /* eith
38260 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64  er the conch did
38270 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20  n't match or we 
38280 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
38290 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20   new one */.    
382a0 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
382b0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
382c0 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f        proxyGetLo
382d0 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50  ckPath(pCtx->dbP
382e0 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d  ath, lockPath, M
382f0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
38300 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68      tempLockPath
38310 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20   = lockPath;.   
38320 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61       /* create a
38330 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63   copy of the loc
38340 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66  k path _only_ if
38350 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61   the conch is ta
38360 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ken */.      }. 
38370 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75       .      /* u
38380 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68  pdate conch with
38390 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28   host and path (
383a0 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69  this will fail i
383b0 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  f other process.
383c0 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73        ** has a s
383d0 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61  hared lock alrea
383e0 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74  dy), if the host
383f0 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65   id matches, use
38400 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a   the big.      *
38410 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a  * stick..      *
38420 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73 28  /.      futimes(
38430 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55  conchFile->h, NU
38440 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  LL);.      if( h
38450 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21 63  ostIdMatch && !c
38460 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20  reateConch ){.  
38470 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46        if( conchF
38480 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63  ile->pInode && c
38490 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  onchFile->pInode
384a0 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
384b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
384c0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
384d0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
384e0 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
384f0 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
38500 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72        ** same pr
38510 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
38520 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
38530 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lock. */.       
38540 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
38550 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
38560 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a  lse {          .
38570 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
38580 72