/ Hex Artifact Content
Login

Artifact 24e4b7f6f89b742357068959255c4530014254579c09c1b56beff1014eb0c0c1:


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 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1f30: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f40: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1f50: 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *pId;          /
1f60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1f70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1f80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f90: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
1fa0: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
1fb0: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
1fc0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
1fd0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
1fe0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
1ff0: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
2000: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
2010: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
2020: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
2030: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2040: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
2050: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2060: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
2070: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
2080: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
2090: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
20a0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
20b0: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
20c0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
20d0: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
20e0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
20f0: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
2100: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
2110: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2120: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2130: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2140: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2150: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2160: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2170: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
2180: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
2190: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
21a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
21b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
21c0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
21d0: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
21e0: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
21f0: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
2200: 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69  n */..#endif..#i
2210: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2220: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2230: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2240: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2250: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2260: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2270: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2280: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2290: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
22a0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
22b0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
22c0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54  .#endif.};../* T
22d0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  his variable hol
22e0: 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  ds the process i
22f0: 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65  d (pid) from whe
2300: 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  n the xRandomnes
2310: 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61  s().** method wa
2320: 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f  s called.  If xO
2330: 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  pen() is called 
2340: 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74  from a different
2350: 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20   process id,.** 
2360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2370: 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63  a fork() has occ
2380: 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20  urred, the PRNG 
2390: 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a  will be reset..*
23a0: 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20 72  /.static pid_t r
23b0: 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30  andomnessPid = 0
23c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
23d0: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
23e0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
23f0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
2400: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2410: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
2420: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2430: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2440: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2450: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2460: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2470: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2480: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2490: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
24a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
24b0: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
24c0: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
24f0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2500: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2510: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2520: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
2530: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2540: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2550: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2560: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2570: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2580: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2590: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
25a0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
25b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
25c0: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
25d0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
25e0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
25f0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
2600: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
2610: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
2620: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
2630: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2640: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2650: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2660: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2670: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2680: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2690: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
26a0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
26b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
26c0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
26d0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
26e0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
26f0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
2700: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
2710: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2720: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2730: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2750: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2760: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2770: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2780: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2790: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
27a0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
27b0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
27c0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
27d0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
27e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27f0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2800: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2810: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2820: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2830: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2840: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2850: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
2860: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
2870: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
2880: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
2890: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
28a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
28b0: 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61 75  AVE_MREMAP defau
28c0: 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c  lts to true on L
28d0: 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20 65  inux and false e
28e0: 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e 0a  verywhere else..
28f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2900: 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69  HAVE_MREMAP).# i
2910: 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
2920: 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
2930: 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20 20  _GNU_SOURCE).#  
2940: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
2950: 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  AP 1.# else.#  d
2960: 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41  efine HAVE_MREMA
2970: 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  P 0.# endif.#end
2980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63  if../*.** Explic
2990: 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36 34  itly call the 64
29a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  -bit version of 
29b0: 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f  lseek() on Andro
29c0: 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  id. Otherwise, l
29d0: 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65  seek().** is the
29e0: 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c   32-bit version,
29f0: 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f   even if _FILE_O
2a00: 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73  FFSET_BITS=64 is
2a10: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
2a20: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
2a30: 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c  # define lseek l
2a40: 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 23  seek64.#endif..#
2a50: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
2a60: 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65 63  /*.** Linux-spec
2a70: 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69 63  ific IOCTL magic
2a80: 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66 6f   numbers used fo
2a90: 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46 32  r controlling F2
2aa0: 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 32  FS.*/.#define F2
2ab0: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20 20  FS_IOCTL_MAGIC  
2ac0: 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66 69        0xf5.#defi
2ad0: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52  ne F2FS_IOC_STAR
2ae0: 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20  T_ATOMIC_WRITE  
2af0: 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54     _IO(F2FS_IOCT
2b00: 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65 66  L_MAGIC, 1).#def
2b10: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d  ine F2FS_IOC_COM
2b20: 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
2b30: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b40: 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64 65  TL_MAGIC, 2).#de
2b50: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
2b60: 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ART_VOLATILE_WRI
2b70: 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  TE   _IO(F2FS_IO
2b80: 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23 64  CTL_MAGIC, 3).#d
2b90: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 41  efine F2FS_IOC_A
2ba0: 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
2bb0: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2bc0: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a 23  OCTL_MAGIC, 5).#
2bd0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2be0: 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20 20  GET_FEATURES    
2bf0: 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46 53         _IOR(F2FS
2c00: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31 32  _IOCTL_MAGIC, 12
2c10: 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20 46  , u32).#define F
2c20: 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d  2FS_FEATURE_ATOM
2c30: 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34 0a  IC_WRITE 0x0004.
2c40: 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
2c50: 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  x__ */.../*.** D
2c60: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2c70: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2c80: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2c90: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ca0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2cb0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2cc0: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2cd0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2ce0: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2cf0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2d00: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2d10: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2d20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2d30: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2d40: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2d50: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2d60: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2d70: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2d80: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2d90: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2da0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2dc0: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2dd0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2de0: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2df0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2e00: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2e10: 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  e);.}../* Forwar
2e20: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2e30: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2e40: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2e50: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  ar*, int*);.stat
2e60: 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
2e70: 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f  gesize(void);../
2e80: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
2e90: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
2ea0: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
2eb0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
2ec0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
2ed0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
2ee0: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
2ef0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
2f00: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
2f10: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
2f20: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
2f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
2f40: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
2f50: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
2f60: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
2f70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
2f80: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
2f90: 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61  truct unix_sysca
2fa0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
2fb0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
2fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2fd0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2ff0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3000: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3010: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3020: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3030: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3040: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3050: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3060: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20  aSyscall[] = {. 
3070: 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20   { "open",      
3080: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3090: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65  all_ptr)posixOpe
30a0: 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  n,  0  },.#defin
30b0: 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28  e osOpen      ((
30c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
30d0: 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73  r*,int,int))aSys
30e0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
30f0: 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20  )..  { "close", 
3100: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3110: 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73  syscall_ptr)clos
3120: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3130: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20  efine osClose   
3140: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29    ((int(*)(int))
3150: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3160: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65  rent)..  { "acce
3170: 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ss",       (sqli
3180: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3190: 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d  access,     0  }
31a0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65  ,.#define osAcce
31b0: 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  ss    ((int(*)(c
31c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29  onst char*,int))
31d0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
31e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63  rent)..  { "getc
31f0: 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wd",       (sqli
3200: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3210: 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d  getcwd,     0  }
3220: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63  ,.#define osGetc
3230: 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29  wd    ((char*(*)
3240: 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  (char*,size_t))a
3250: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3260: 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22  ent)..  { "stat"
3270: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3280: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73  e3_syscall_ptr)s
3290: 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  tat,       0  },
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20  .#define osStat 
32b0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
32c0: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
32d0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
32e0: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  [4].pCurrent)../
32f0: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
3300: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
3310: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
3320: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
3330: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
3340: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
3350: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
3360: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
3370: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
3380: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
3390: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
33a0: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
33b0: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
33c0: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
33d0: 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74  it is DOS - what
33e0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
33f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
3400: 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22  PP__.  { "fstat"
3410: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
3430: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3440: 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65  t(a,b,c)    0.#e
3450: 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73  lse     .  { "fs
3460: 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71  tat",        (sq
3470: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3480: 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20  r)fstat,      0 
3490: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
34a0: 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29  tat     ((int(*)
34b0: 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74  (int,struct stat
34c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  *))aSyscall[5].p
34d0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
34e0: 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22  .  { "ftruncate"
34f0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3500: 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63  scall_ptr)ftrunc
3510: 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  ate,  0  },.#def
3520: 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20  ine osFtruncate 
3530: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
3540: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  _t))aSyscall[6].
3550: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3560: 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28  fcntl",        (
3570: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3580: 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20  ptr)fcntl,      
3590: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
35a0: 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28  Fcntl     ((int(
35b0: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
35c0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
35d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64  rent)..  { "read
35e0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
35f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3600: 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d  read,       0  }
3610: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ,.#define osRead
3620: 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28        ((ssize_t(
3630: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
3640: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  e_t))aSyscall[8]
3650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3660: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3670: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3680: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3690: 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  E.  { "pread",  
36a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
36c0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  ,      0  },.#el
36d0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  se.  { "pread", 
36e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
36f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3700: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3710: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3720: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
3730: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3740: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3750: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
3760: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3770: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3780: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3790: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
37a0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20  ll_ptr)pread64, 
37b0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
37c0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
37d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
37f0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3800: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3810: 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  64 ((ssize_t(*)(
3820: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3830: 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63 61  ,off64_t))aSysca
3840: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
3850: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
3860: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3870: 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65  yscall_ptr)write
3880: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3890: 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20  fine osWrite    
38a0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
38b0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
38c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ze_t))aSyscall[1
38d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
38e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
38f0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
3900: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3910: 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22  YLE.  { "pwrite"
3920: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3930: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3940: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3950: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3960: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3970: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3980: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3990: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
39a0: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
39b0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
39c0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
39d0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
39f0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3a00: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3a10: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
3a20: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
3a30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a40: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3a50: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3a60: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3a70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a80: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3a90: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3ab0: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3ac0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3ad0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
3ae0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3af0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3b00: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3b10: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3b20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b30: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
3b40: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3b50: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b60: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b70: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b80: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b90: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3ba0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3bb0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3bc0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3bd0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3be0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bf0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3c00: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3c10: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3c20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c30: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c60: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c70: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c80: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ca0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3cb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3cc0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3cd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3ce0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3cf0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3d00: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3d10: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3d20: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3d30: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3d40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d50: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d60: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d70: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d90: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3da0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3db0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3dc0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3dd0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3de0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3df0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3e00: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3e10: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3e20: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3e30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3e40: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e60: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e70: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e80: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e90: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ea0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3eb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3ec0: 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e  ined(HAVE_FCHOWN
3ed0: 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ).  { "fchown", 
3ee0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3ef0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3f00: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3f10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6f  .#else.  { "fcho
3f20: 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wn",       (sqli
3f30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3f50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3f60: 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20  fine osFchown   
3f70: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69   ((int(*)(int,ui
3f80: 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63  d_t,gid_t))aSysc
3f90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3fa0: 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  )..  { "geteuid"
3fb0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3fc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
3fd0: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
3fe0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 65  ,.#define osGete
3ff0: 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a 29  uid   ((uid_t(*)
4000: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
4010: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
4020: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4030: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4050: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70  SIZE>0.  { "mmap
4060: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4070: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4080: 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mmap,           
4090: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
40a0: 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20  "mmap",         
40b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
40c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
40e0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70  f.#define osMmap
40f0: 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64   ((void*(*)(void
4100: 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74  *,size_t,int,int
4110: 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ,int,off_t))aSys
4120: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
4130: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
4140: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4150: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
4160: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20  MMAP_SIZE>0.  { 
4170: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
4180: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4190: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
41a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41b0: 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20  .  { "munmap",  
41c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
41d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
41e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4200: 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMunmap ((void*(
4210: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  *)(void*,size_t)
4220: 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43  )aSyscall[23].pC
4230: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56  urrent)..#if HAV
4240: 45 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65  E_MREMAP && (!de
4250: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4260: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
4270: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
4280: 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20  ).  { "mremap", 
4290: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
42a0: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61  yscall_ptr)mrema
42b0: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
42c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d  .#else.  { "mrem
42d0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
42e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
42f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4300: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
4310: 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28  fine osMremap ((
4320: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
4330: 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74  ize_t,size_t,int
4340: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,...))aSyscall[2
4350: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4360: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4370: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
4380: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
4390: 49 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61  IZE>0.  { "getpa
43a0: 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74  gesize",  (sqlit
43b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75  e3_syscall_ptr)u
43c0: 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20  nixGetpagesize, 
43d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
43e0: 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28  getpagesize",  (
43f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4400: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
4410: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4420: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61  .#define osGetpa
4430: 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28  gesize ((int(*)(
4440: 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32  void))aSyscall[2
4450: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
4460: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52  f defined(HAVE_R
4470: 45 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65  EADLINK).  { "re
4480: 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71  adlink",     (sq
4490: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
44a0: 72 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20  r)readlink,     
44b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
44c0: 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20  { "readlink",   
44d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
44e0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
44f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4500: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  dif.#define osRe
4510: 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74  adlink ((ssize_t
4520: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
4530: 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53  char*,size_t))aS
4540: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
4550: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4560: 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20  d(HAVE_LSTAT).  
4570: 7b 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20  { "lstat",      
4580: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
4590: 61 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20  all_ptr)lstat,  
45a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
45b0: 73 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20  se.  { "lstat", 
45c0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
45d0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
45f0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
4600: 20 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28 28   osLstat      ((
4610: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
4620: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
4630: 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43  )aSyscall[27].pC
4640: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 69 6f  urrent)..  { "io
4650: 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73  ctl",         (s
4660: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4670: 74 72 29 69 6f 63 74 6c 2c 20 20 20 20 20 20 20  tr)ioctl,       
4680: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
4690: 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29  osIoctl ((int(*)
46a0: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
46b0: 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72  yscall[28].pCurr
46c0: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
46d0: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
46e0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
46f0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73   */.../*.** On s
4700: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
4710: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
4720: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
4730: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
4740: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
4750: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
4760: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
4770: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
4780: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
4790: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
47a0: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
47b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
47c0: 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  stFchown(int fd,
47d0: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
47e0: 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69  t gid){.#if defi
47f0: 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29  ned(HAVE_FCHOWN)
4800: 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65  .  return osGete
4810: 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63  uid() ? 0 : osFc
4820: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
4830: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
4840: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
4850: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
4860: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
4870: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4880: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4890: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
48a0: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
48b0: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
48c0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
48d0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
48e0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
48f0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
4900: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
4910: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
4920: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
4930: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
4940: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
4950: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4960: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4970: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4980: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4990: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
49a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
49b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
49c0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
49d0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
49e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
49f0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
4a00: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
4a10: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
4a20: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
4a30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4a40: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4a50: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
4a60: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4a70: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4a80: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4a90: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4aa0: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4ab0: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4ac0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4ad0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4ae0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4af0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
4b00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4b10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4b20: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4b30: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4b40: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
4b50: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
4b60: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
4b70: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4b80: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4b90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4bc0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4bd0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4be0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4bf0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
4c00: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
4c10: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4c20: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4c30: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4c40: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4c50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4c60: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4c70: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4c80: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4c90: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4ca0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4cb0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4cc0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4cd0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4cf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4d00: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
4d10: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
4d20: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
4d30: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
4d40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4d50: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
4d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4d70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4d80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4da0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4db0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4dc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4dd0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4de0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4df0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
4e00: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
4e10: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
4e20: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
4e30: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
4e40: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
4e50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
4e60: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
4e70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4e80: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4e90: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4ea0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4eb0: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4ec0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4ed0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4ee0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4ef0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4f00: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
4f10: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4f20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
4f30: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
4f40: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4f50: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
4f60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4f70: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
4f80: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
4f90: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
4fa0: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
4fb0: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
4fc0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
4fd0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
4fe0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4ff0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
5000: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
5010: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
5020: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
5030: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
5040: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
5050: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5060: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
5070: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
5080: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
5090: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
50a0: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
50b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
50c0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
50d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
50e0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
50f0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
5100: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
5110: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
5120: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
5130: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
5140: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
5150: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
5160: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
5170: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5180: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
5190: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
51a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
51b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
51c0: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
51d0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
51e0: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
51f0: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
5200: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
5210: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
5220: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
5230: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
5240: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
5250: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
5260: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
5270: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
5280: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
5290: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
52a0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
52b0: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
52c0: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
52d0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
52e0: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
52f0: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
5300: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
5310: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
5320: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
5330: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
5340: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
5350: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
5360: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
5370: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
5380: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
5390: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
53a0: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
53b0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
53c0: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
53d0: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
53e0: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
53f0: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
5400: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
5410: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
5420: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
5430: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
5440: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
5450: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
5460: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
5470: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
5480: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
5490: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
54a0: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
54b0: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
54c0: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
54d0: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
54e0: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
54f0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
5500: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
5510: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
5520: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
5530: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
5540: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
5550: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
5560: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
5570: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
5580: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
5590: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
55a0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
55b0: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
55c0: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
55d0: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
55e0: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
55f0: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
5600: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
5610: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
5620: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
5630: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
5640: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
5650: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
5660: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
5670: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
5680: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
5690: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
56a0: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
56b0: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
56c0: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
56d0: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
56e0: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
56f0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
5700: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
5710: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
5720: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
5730: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
5740: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
5750: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
5760: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
5770: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5780: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5790: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
57a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
57b0: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
57c0: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
57d0: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
57e0: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
57f0: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
5800: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
5810: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
5820: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
5830: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
5840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
5850: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
5860: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
5870: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5880: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5890: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
58a0: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
58b0: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
58c0: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
58d0: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
58e0: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
58f0: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
5900: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
5910: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
5920: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
5930: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
5940: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
5950: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
5960: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5970: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5980: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5990: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
59a0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
59b0: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
59c0: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
59d0: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
59e0: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
59f0: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
5a00: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
5a10: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
5a20: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
5a30: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
5a40: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
5a50: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5a60: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5a70: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5a80: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5a90: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5aa0: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5ab0: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5ac0: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5ad0: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5ae0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5af0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
5b00: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
5b10: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
5b20: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
5b30: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
5b40: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
5b50: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5b60: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5b70: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5b80: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5b90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5ba0: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5bb0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5bc0: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5bd0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5be0: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5bf0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
5c00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
5c10: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5c20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5c30: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
5c40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5c50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
5c60: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
5c70: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
5c80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
5c90: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5ca0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5cb0: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5cc0: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
5cd0: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
5ce0: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
5cf0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
5d00: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
5d10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
5d20: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
5d30: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
5d40: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
5d50: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5d60: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5d70: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5d80: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5d90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
5da0: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
5db0: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
5dc0: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5dd0: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
5de0: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
5df0: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
5e00: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5e10: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
5e20: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
5e30: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
5e40: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
5e50: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
5e60: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
5e70: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
5e80: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5e90: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5ea0: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5eb0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5ec0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5ed0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
5ee0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5ef0: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
5f00: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
5f10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5f20: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
5f30: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
5f40: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
5f50: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
5f60: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
5f70: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
5f80: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5f90: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
5fa0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
5fb0: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
5fc0: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
5fd0: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
5fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
5ff0: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
6000: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
6010: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
6020: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
6030: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
6040: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
6050: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
6060: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6070: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
6080: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
6090: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
60a0: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
60b0: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
60c0: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
60d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
60e0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
60f0: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
6100: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
6110: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
6120: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
6130: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
6140: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
6150: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
6160: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
6170: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
6180: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
6190: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
61a0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
61b0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
61c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
61d0: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
61e0: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
61f0: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
6200: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
6210: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
6220: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
6230: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
6240: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
6250: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
6260: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
6270: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
6280: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
6290: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
62a0: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
62b0: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
62c0: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
62d0: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
62e0: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
62f0: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
6300: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
6310: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
6320: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
6330: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
6340: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
6350: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
6360: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
6370: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
6380: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
6390: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
63a0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
63b0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
63c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
63d0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
63e0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
63f0: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
6400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
6410: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
6420: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
6430: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
6440: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
6450: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
6460: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
6470: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
6480: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
6490: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
64a0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
64b0: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
64c0: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
64d0: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
64e0: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
64f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
6500: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
6510: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
6520: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
6530: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
6540: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
6550: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
6560: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
6570: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
6580: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
6590: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
65a0: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
65b0: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
65c0: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
65d0: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
65e0: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
65f0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6600: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
6610: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
6620: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
6630: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
6640: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
6650: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
6660: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
6670: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
6680: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
6690: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
66a0: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
66b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
66c0: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
66d0: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
66e0: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
66f0: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
6700: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
6710: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
6720: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
6730: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
6740: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
6750: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
6760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6770: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
6780: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
6790: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
67a0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
67b0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
67c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
67d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
67e0: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
67f0: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
6800: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
6810: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
6820: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
6830: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
6840: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
6850: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
6860: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
6870: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
6880: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
6890: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
68a0: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
68b0: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
68c0: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
68d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
68e0: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
68f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
6900: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
6910: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
6920: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
6930: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
6940: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
6950: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
6960: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
6970: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
6980: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
6990: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
69a0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
69b0: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
69c0: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
69d0: 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28  r) {.  assert( (
69e0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
69f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
6a00: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6a10: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6a20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
6a30: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
6a40: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
6a50: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
6a60: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20  RDLOCK) ||.     
6a70: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6a80: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6a90: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
6aa0: 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68  OCK) );.  switch
6ab0: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
6ac0: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
6ad0: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
6ae0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
6af0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
6b00: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
6b10: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
6b20: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
6b30: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
6b40: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6b50: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6b60: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6b70: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
6b80: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6b90: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6bb0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6bc0: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
6bd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
6be0: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61  ERM;.    .  defa
6bf0: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
6c00: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
6c10: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c60: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
6c80: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
6c90: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
6ca0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
6cb0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
6cc0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
6cd0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
6ce0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
6cf0: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
6d00: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
6d10: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
6d20: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
6d30: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
6d40: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
6d50: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
6d60: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
6d70: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
6d80: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
6d90: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
6da0: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
6db0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
6dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6dd0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
6de0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
6df0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
6e00: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
6e10: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
6e20: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
6e30: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
6e40: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
6e50: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
6e60: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
6e70: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
6e80: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
6e90: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
6ea0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
6eb0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
6ec0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
6ed0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
6ee0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
6ef0: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
6f00: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
6f10: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
6f20: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
6f30: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
6f40: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
6f50: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
6f60: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
6f70: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
6f80: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6f90: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
6fa0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
6fb0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
6fc0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
6fd0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
6fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ff0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7000: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
7010: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
7020: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7040: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
7050: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
7060: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
7070: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
7080: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
7090: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
70a0: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
70b0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
70c0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
70d0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
70e0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
70f0: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
7100: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
7110: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7120: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
7130: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
7140: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
7150: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
7160: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
7170: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
7180: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
7190: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
71a0: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
71b0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
71c0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
71d0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
71e0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
71f0: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
7200: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
7210: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
7220: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
7230: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
7240: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
7250: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
7260: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
7270: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
7280: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
7290: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
72a0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
72b0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
72c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
72d0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
72e0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
72f0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
7300: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
7310: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
7320: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
7330: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
7340: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
7350: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
7360: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
7370: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
7380: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7390: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
73a0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
73b0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
73c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
73d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
73e0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
73f0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
7400: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
7410: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
7420: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
7430: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
7440: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
7450: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
7460: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7470: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7480: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
7490: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
74a0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
74b0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
74c0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
74d0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
74e0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
74f0: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
7500: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
7510: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
7520: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
7530: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
7540: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
7550: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
7560: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
7570: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
7580: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
7590: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
75a0: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
75b0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
75c0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
75d0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
75e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
75f0: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
7600: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
7610: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
7620: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
7630: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
7640: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
7650: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
7660: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
7670: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
7680: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
7690: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
76a0: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
76b0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
76c0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
76d0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
76e0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
76f0: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
7700: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
7710: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
7720: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
7750: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
7760: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
7770: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
7780: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
7790: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
77a0: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
77b0: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
77c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
77d0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
77e0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
77f0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7800: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
7810: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
7820: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
7830: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
7840: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
7850: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
7860: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
7870: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
7880: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7890: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
78a0: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
78b0: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
78c0: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
78d0: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
78e0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
78f0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7900: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
7910: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
7920: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
7930: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
7940: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
7950: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
7960: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
7970: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
7980: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
7990: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
79a0: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
79b0: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
79c0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
79d0: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
79e0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
79f0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
7a00: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
7a10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7a20: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
7a30: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
7a40: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
7a50: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
7a60: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
7a70: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
7a80: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
7a90: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
7aa0: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
7ab0: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
7ac0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
7ad0: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
7ae0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
7af0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
7b00: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
7b10: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
7b20: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
7b30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7b40: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
7b50: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7b60: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
7b70: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
7b80: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
7b90: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
7ba0: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
7bb0: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
7bc0: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
7bd0: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
7be0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7bf0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
7c00: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
7c10: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
7c20: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
7c30: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
7c40: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
7c50: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7c60: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
7c70: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
7c80: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
7c90: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
7ca0: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
7cb0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
7cc0: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
7cd0: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
7ce0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
7cf0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
7d00: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
7d10: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
7d20: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
7d30: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
7d40: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
7d50: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
7d60: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
7d70: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e10: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
7e40: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
7e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e60: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
7e70: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7e80: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
7e90: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
7ea0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
7eb0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
7ec0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
7ed0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
7ee0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
7ef0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
7f00: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
7f10: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
7f20: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
7f30: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
7f40: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7f50: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
7f60: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
7f70: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
7f80: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
7f90: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
7fa0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
7fb0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
7fc0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7fd0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
7fe0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
7ff0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
8000: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
8010: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
8020: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
8030: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
8040: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
8050: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
8060: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
8070: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
8080: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
8090: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
80a0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
80b0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
80c0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
80d0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
80e0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
80f0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
8100: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
8110: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
8120: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
8130: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
8140: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
8150: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
8160: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
8170: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
8180: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
8190: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
81a0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
81b0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
81c0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
81d0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
81e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
81f0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
8200: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
8210: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
8220: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
8230: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
8240: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
8250: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
8260: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
8270: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
8280: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
8290: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
82a0: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
82b0: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
82c0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
82d0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
82e0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
82f0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
8300: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
8310: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
8320: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
8330: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
8340: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
8350: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
8360: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
8370: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
8380: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
8390: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
83a0: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
83b0: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
83c0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
83d0: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
83e0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
83f0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
8400: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
8410: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8420: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
8430: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
8440: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
8450: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
8460: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
8470: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
8480: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
8490: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
84a0: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
84b0: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
84c0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
84d0: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
84e0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
84f0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
8500: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
8510: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
8520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
8530: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
8540: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
8550: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
8560: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
8570: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
8580: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
8590: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
85a0: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
85b0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
85c0: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
85d0: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
85e0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
85f0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
8600: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
8610: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
8620: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
8630: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
8640: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
8650: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
8660: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
8670: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
8680: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
8690: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
86a0: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
86b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
86c0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
86d0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
86e0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
86f0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
8700: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
8710: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
8720: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
8730: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
8740: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
8750: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
8760: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
8770: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
8780: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
8790: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
87a0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
87b0: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
87c0: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
87d0: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
87e0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
87f0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
8800: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
8810: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
8820: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
8830: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
8840: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
8850: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
8860: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
8870: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
8880: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
8890: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
88a0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
88b0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
88c0: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
88d0: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
88e0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
88f0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
8900: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
8910: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
8920: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
8930: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
8940: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
8950: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
8960: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
8970: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
8980: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
8990: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
89a0: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
89b0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
89c0: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
89d0: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
89e0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
89f0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
8a00: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
8a10: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
8a20: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
8a30: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
8a40: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
8a50: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
8a60: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
8a70: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
8a80: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
8a90: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
8aa0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
8ab0: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
8ac0: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
8ad0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
8ae0: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
8af0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
8b00: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
8b10: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8b20: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
8b30: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
8b40: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
8b50: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
8b60: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
8b70: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
8b80: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
8b90: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
8ba0: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
8bb0: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
8bc0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
8bd0: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
8be0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
8bf0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
8c00: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
8c10: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
8c20: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
8c30: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
8c40: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8c50: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
8c60: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
8c70: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
8c80: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
8c90: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
8ca0: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
8cb0: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
8cc0: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
8cd0: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
8ce0: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
8cf0: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
8d00: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
8d10: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
8d20: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
8d30: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
8d40: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
8d50: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
8d60: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
8d70: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
8d80: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
8d90: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
8da0: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
8db0: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
8dc0: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
8dd0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
8de0: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
8df0: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
8e00: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
8e10: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
8e20: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
8e30: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
8e40: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
8e50: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
8e60: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
8e70: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
8e80: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8e90: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
8ea0: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
8eb0: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
8ec0: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
8ed0: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
8ee0: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
8ef0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
8f00: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
8f10: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
8f20: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
8f30: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8f40: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8f50: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
8f60: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
8f70: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
8f80: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
8f90: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
8fa0: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
8fb0: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
8fc0: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
8fd0: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
8fe0: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
8ff0: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
9000: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
9010: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
9020: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
9030: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
9040: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
9050: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
9060: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
9070: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
9080: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
9090: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
90a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
90b0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
90c0: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
90d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
90e0: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
90f0: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
9100: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
9110: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
9120: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
9130: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
9140: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
9150: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
9160: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9170: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
9180: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
9190: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
91a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
91b0: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
91c0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
91d0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
91e0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
91f0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
9200: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
9210: 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20  lse.  /* We are 
9220: 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76  told that some v
9230: 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f  ersions of Andro
9240: 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  id contain a bug
9250: 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73   that.  ** sizes
9260: 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33   ino_t at only 3
9270: 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f  2-bits instead o
9280: 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a  f 64-bits. (See.
9290: 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64    ** https://and
92a0: 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67  roid-review.goog
92b0: 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63  lesource.com/#/c
92c0: 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73  /115351/3/dist/s
92d0: 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54  qlite3.c).  ** T
92e0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
92f0: 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  is, always alloc
9300: 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20  ate 64-bits for 
9310: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
9320: 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c  .  .  ** On smal
9330: 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20  l machines that 
9340: 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74  only have 32-bit
9350: 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61   inodes, this wa
9360: 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20  stes 4 bytes,.  
9370: 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f 75  ** but that shou
9380: 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20  ld not be a big 
9390: 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41  deal. */.  /* WA
93a0: 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  S:  ino_t ino;  
93b0: 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20   */.  u64 ino;  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
93e0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
93f0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
9400: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
9410: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
9420: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
9430: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
9440: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
9450: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
9460: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
9470: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
9480: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
9490: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
94a0: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
94b0: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
94c0: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
94d0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
94e0: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
94f0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
9500: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
9510: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
9520: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
9530: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
9540: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
9550: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
9560: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
9570: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
9580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9590: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
95a0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
95b0: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
95c0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
95d0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
95e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
95f0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
9600: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
9610: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
9620: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
9630: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
9640: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
9650: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
9660: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9670: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
9680: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9690: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
96a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
96d0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
96e0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
96f0: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
9700: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
9710: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
9720: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
9730: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
9740: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
9770: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
9780: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
9790: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
97a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
97b0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
97c0: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
97d0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
97e0: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
97f0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
9800: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9810: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
9820: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
9830: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
9840: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
9850: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
9860: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
9870: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
9880: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
9890: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
98a0: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
98b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
98c0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
98d0: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
98e0: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
9900: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
9910: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
9920: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
9930: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
9940: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
9950: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
9960: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
9970: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9980: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
9990: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
99a0: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
99b0: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
99c0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
99d0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29  LogErrorAtLine()
99e0: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
99f0: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
9a00: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
9a10: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
9a20: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
9a30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9a40: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
9a50: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
9a60: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
9a70: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
9a80: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
9a90: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
9aa0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
9ab0: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
9ac0: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
9ad0: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
9ae0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
9af0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
9b00: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
9b10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
9b20: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
9b30: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
9b40: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
9b50: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
9b60: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
9b70: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
9b80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9b90: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
9ba0: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
9bb0: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
9bc0: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
9bd0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
9be0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
9bf0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
9c00: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
9c10: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73  en") and the ass
9c20: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
9c30: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
9c40: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
9c50: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
9c60: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
9c70: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
9c80: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
9c90: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
9ca0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
9cb0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9cd0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9ce0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9cf0: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
9d00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
9d10: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
9d20: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
9d30: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d50: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
9d60: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
9d70: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
9da0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
9db0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
9dc0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
9dd0: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
9de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
9df0: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
9e00: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
9e10: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
9e20: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
9e30: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
9e40: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
9e50: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
9e60: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
9e70: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
9e80: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
9e90: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
9ea0: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
9eb0: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
9ec0: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
9ed0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
9ee0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
9ef0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
9f00: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
9f10: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
9f20: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
9f30: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
9f40: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
9f50: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
9f60: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
9f70: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
9f80: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
9f90: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
9fa0: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
9fb0: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
9fc0: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
9fd0: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
9fe0: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
9ff0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
a000: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
a010: 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  GNU version of s
a020: 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74  trerror_r() that
a030: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
a040: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
a050: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
a060: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
a070: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
a080: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
a090: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
a0a0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
a0b0: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
a0c0: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
a0d0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
a0e0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
a0f0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
a100: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
a110: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
a120: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
a130: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
a140: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
a150: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
a160: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
a170: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
a180: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
a190: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
a1a0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
a1b0: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
a1c0: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
a1d0: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
a1e0: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
a1f0: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
a200: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
a210: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
a220: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
a230: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
a240: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
a250: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
a260: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
a270: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
a280: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
a290: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
a2a0: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
a2b0: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
a2c0: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
a2d0: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
a2e0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a2f0: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
a300: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
a310: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
a320: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
a330: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
a340: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
a350: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
a360: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
a370: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
a380: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
a390: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  no);.#endif..  i
a3a0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
a3b0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
a3c0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
a3d0: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
a3e0: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
a3f0: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
a400: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
a410: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
a420: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
a430: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
a440: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
a450: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
a460: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
a470: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
a480: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
a490: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
a4a0: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
a4b0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
a4c0: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
a4d0: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
a4e0: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
a4f0: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
a500: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
a510: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
a520: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
a530: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
a540: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
a550: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
a560: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
a570: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
a580: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
a590: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
a5a0: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
a5b0: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
a5c0: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
a5d0: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
a5e0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
a5f0: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
a600: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
a610: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
a620: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
a630: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
a640: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
a650: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
a660: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
a670: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
a680: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
a690: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
a6a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a6b0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
a6c0: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
a6d0: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
a6e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a6f0: 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  e pFile->lastErr
a700: 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20  no.  Do this in 
a710: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20  a subroutine as 
a720: 74 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a  that provides.**
a730: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
a740: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
a750: 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  akpoint..*/.stat
a760: 69 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73  ic void storeLas
a770: 74 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20  tErrno(unixFile 
a780: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f  *pFile, int erro
a790: 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73  r){.  pFile->las
a7a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
a7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
a7c0: 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ll file descript
a7d0: 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69  ors accumuated i
a7e0: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
a7f0: 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  nfo->pUnused lis
a800: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
a810: 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46  id closePendingF
a820: 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ds(unixFile *pFi
a830: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
a840: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
a850: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a860: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b  UnixUnusedFd *p;
a870: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
a880: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
a890: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
a8a0: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
a8b0: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
a8c0: 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  xt;.    robust_c
a8d0: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66  lose(pFile, p->f
a8e0: 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
a8f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a900: 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  );.  }.  pInode-
a910: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
a920: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
a930: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
a940: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
a950: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
a960: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
a970: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
a980: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
a990: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
a9a0: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
a9b0: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
a9c0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
a9d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
a9e0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a9f0: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78  seInodeInfo(unix
aa00: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
aa10: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
aa20: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
aa30: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
aa40: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
aa50: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
aa60: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
aa70: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
aa80: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
aa90: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
aaa0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
aab0: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
aac0: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
aad0: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
aae0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
aaf0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
ab00: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
ab10: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
ab20: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
ab30: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
ab40: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
ab50: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
ab60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
ab70: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
ab80: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
ab90: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
aba0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
abb0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
abc0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
abd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
abe0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
abf0: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
ac00: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
ac10: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
ac20: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
ac30: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ac40: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
ac50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ac60: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
ac70: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
ac80: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
ac90: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
aca0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
acb0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
acc0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
acd0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
ace0: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
acf0: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
ad00: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
ad10: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
ad20: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
ad30: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
ad40: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
ad50: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
ad60: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
ad70: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
ad80: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
ad90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
ada0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
adb0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
adc0: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
add0: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
ade0: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
adf0: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
ae00: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
ae10: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
ae20: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
ae30: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
ae40: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
ae50: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
ae60: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
ae70: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
aea0: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
aeb0: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
aee0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
aef0: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
af00: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
af10: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
af20: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
af30: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
af40: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
af50: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
af60: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
af70: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
af80: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
af90: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
afa0: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
afb0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
afc0: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
afd0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
afe0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
aff0: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
b000: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
b010: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
b020: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
b030: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
b040: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
b050: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
b060: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46  e->h;.  rc = osF
b070: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
b080: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
b090: 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
b0a0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
b0b0: 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  no);.#if defined
b0c0: 28 45 4f 56 45 52 46 4c 4f 57 29 20 26 26 20 64  (EOVERFLOW) && d
b0d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49  efined(SQLITE_DI
b0e0: 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20 69  SABLE_LFS).    i
b0f0: 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  f( pFile->lastEr
b100: 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29  rno==EOVERFLOW )
b110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b120: 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20  OLFS;.#endif.   
b130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
b140: 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  OERR;.  }..#ifde
b150: 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a  f __APPLE__.  /*
b160: 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d   On OS X on an m
b170: 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c  sdos filesystem,
b180: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
b190: 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20  r is reported.  
b1a0: 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66  ** incorrectly f
b1b0: 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c  or zero-size fil
b1c0: 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  es.  See ticket 
b1d0: 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a  #3260.  To work.
b1e0: 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73    ** around this
b1f0: 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e   problem (we con
b200: 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20 69  sider it a bug i
b210: 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69  n OS X, not SQLi
b220: 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61  te).  ** we alwa
b230: 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ys increase the 
b240: 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62  file size to 1 b
b250: 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  y writing a sing
b260: 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69  le byte.  ** pri
b270: 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20  or to accessing 
b280: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
b290: 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20  .  The one byte 
b2a0: 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20  written is.  ** 
b2b0: 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68 61  an ASCII 'S' cha
b2c0: 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c 73  racter which als
b2d0: 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  o happens to be 
b2e0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
b2f0: 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65   ** in the heade
b300: 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74  r of every SQLit
b310: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20  e database.  In 
b320: 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68 65  this way, if the
b330: 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63  re.  ** is a rac
b340: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68  e condition such
b350: 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68   that another th
b360: 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64 79  read has already
b370: 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20   populated.  ** 
b380: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
b390: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
b3a0: 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e  no damage is don
b3b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74  e..  */.  if( st
b3c0: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  atbuf.st_size==0
b3d0: 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c   && (pFile->fsFl
b3e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46  ags & SQLITE_FSF
b3f0: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d  LAGS_IS_MSDOS)!=
b400: 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20  0 ){.    do{ rc 
b410: 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53  = osWrite(fd, "S
b420: 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72  ", 1); }while( r
b430: 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
b440: 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72  NTR );.    if( r
b450: 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74  c!=1 ){.      st
b460: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
b470: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
b480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b490: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20  IOERR;.    }.   
b4a0: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
b4b0: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
b4c0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
b4d0: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
b4e0: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
b4f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b500: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
b510: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
b520: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
b530: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
b540: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
b550: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
b560: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
b570: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
b580: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
b590: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
b5a0: 20 3d 20 28 75 36 34 29 73 74 61 74 62 75 66 2e   = (u64)statbuf.
b5b0: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
b5c0: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
b5d0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
b5e0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
b5f0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
b600: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
b610: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
b620: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
b630: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
b640: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
b650: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
b660: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
b670: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
b680: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
b690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
b6a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
b6b0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
b6c0: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
b6d0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
b6e0: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
b6f0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b700: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
b710: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
b720: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
b730: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
b740: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
b750: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
b760: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
b770: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
b780: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
b790: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
b7a0: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
b7b0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
b7c0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
b7d0: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
b7e0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
b7f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b800: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
b810: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
b820: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
b830: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
b840: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
b850: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
b860: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
b870: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
b880: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
b890: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
b8a0: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
b8b0: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
b8c0: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
b8d0: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
b8e0: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
b8f0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
b900: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
b910: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
b920: 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20 20  buf)!=0 .       
b930: 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73 74    || (u64)buf.st
b940: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
b950: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
b960: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
b970: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
b980: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
b990: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
b9a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b9b0: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
b9c0: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
b9d0: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
b9e0: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
b9f0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
ba00: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
ba10: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
ba20: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
ba30: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
ba40: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
ba50: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
ba60: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
ba70: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
ba80: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
ba90: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
baa0: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
bab0: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
bac0: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
bad0: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73  t rc;..  /* Thes
bae0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
baf0: 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20 6d  occurs for the m
bb00: 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  ain database onl
bb10: 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  y */.  if( pFile
bb20: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bb30: 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20  IXFILE_NOLOCK ) 
bb40: 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20  return;..  rc = 
bb50: 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
bb60: 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72  , &buf);.  if( r
bb70: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c!=0 ){.    sqli
bb80: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
bb90: 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20  ARNING, "cannot 
bba0: 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73  fstat db file %s
bbb0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
bbc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bbd0: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
bbe0: 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73  link==0 ){.    s
bbf0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bc00: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65  E_WARNING, "file
bc10: 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20   unlinked while 
bc20: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
bc30: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bc40: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
bc50: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29  buf.st_nlink>1 )
bc60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
bc70: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
bc80: 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b  , "multiple link
bc90: 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20  s to file: %s", 
bca0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
bcb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
bcc0: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
bcd0: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
bce0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bcf0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
bd00: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
bd10: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
bd20: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bd30: 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  turn;.  }.}.../*
bd40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bd50: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
bd60: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
bd70: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
bd80: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
bd90: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
bda0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
bdb0: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
bdc0: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
bdd0: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
bde0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
bdf0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
be00: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
be10: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
be20: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
be30: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
be40: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
be50: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
be60: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
be70: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
be80: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
be90: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
bea0: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
beb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bec0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
bed0: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
bee0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
bef0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
bf00: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
bf10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
bf20: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
bf30: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
bf40: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
bf50: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
bf60: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
bf70: 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e  LOCK );.  unixEn
bf80: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
bf90: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
bfa0: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
bfb0: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
bfc0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
bfd0: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
bfe0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
bff0: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
c000: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
c010: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
c020: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c030: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
c040: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
c050: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
c060: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
c070: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
c080: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
c090: 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20  f( !reserved && 
c0a0: 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  !pFile->pInode->
c0b0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a  bProcessLock ){.
c0c0: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
c0d0: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
c0e0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c0f0: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
c100: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
c110: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
c120: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
c130: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
c140: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73  RLCK;.    if( os
c150: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c160: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20  F_GETLK, &lock) 
c170: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c180: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
c190: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
c1a0: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
c1b0: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
c1c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
c1d0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
c1e0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
c1f0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
c200: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c210: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
c220: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
c230: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
c240: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
c250: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
c260: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
c270: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
c280: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
c290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
c2a0: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
c2b0: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
c2c0: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
c2d0: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
c2e0: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
c2f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
c300: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
c310: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
c320: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
c330: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
c340: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
c350: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
c360: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
c370: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
c380: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
c390: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
c3a0: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
c3b0: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
c3c0: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
c3d0: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
c3e0: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
c3f0: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
c400: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
c410: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
c420: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
c430: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
c440: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
c450: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
c460: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
c470: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
c480: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
c490: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
c4a0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
c4b0: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
c4c0: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
c4d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c4e0: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
c4f0: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
c500: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
c510: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
c520: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
c530: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
c540: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
c550: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
c560: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
c570: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
c580: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
c590: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
c5a0: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
c5b0: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
c5c0: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
c5d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
c5e0: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
c5f0: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
c600: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
c610: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
c620: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
c630: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
c640: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
c650: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
c660: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
c670: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
c680: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
c690: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
c6a0: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
c6b0: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74    if( (pFile->ct
c6c0: 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46  rlFlags & (UNIXF
c6d0: 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c  ILE_EXCL|UNIXFIL
c6e0: 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58  E_RDONLY))==UNIX
c6f0: 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20  FILE_EXCL ){.   
c700: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
c710: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
c720: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
c730: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
c740: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
c750: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
c760: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
c770: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
c780: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c790: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
c7a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c7b0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
c7c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
c7d0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
c7e0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
c7f0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c800: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
c810: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
c820: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
c830: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
c840: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
c850: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
c860: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
c870: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
c880: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
c890: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
c8a0: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
c8b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
c8d0: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
c8e0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
c8f0: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
c900: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
c910: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
c920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
c930: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
c940: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
c950: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
c960: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
c970: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
c980: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
c990: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
c9a0: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
c9b0: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
c9c0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
c9d0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
c9e0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
c9f0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
ca00: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
ca10: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
ca20: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
ca30: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
ca40: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
ca50: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
ca60: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
ca70: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
ca80: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
ca90: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
caa0: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
cab0: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
cac0: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
cad0: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
cae0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
caf0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
cb00: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
cb10: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
cb20: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
cb30: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
cb40: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
cb50: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
cb60: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
cb70: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
cb80: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
cb90: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
cba0: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
cbb0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
cbc0: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
cbd0: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
cbe0: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
cbf0: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
cc00: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
cc10: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
cc20: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
cc30: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
cc40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
cc50: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
cc60: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
cc70: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
cc80: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
cc90: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
cca0: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
ccb0: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
ccc0: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
ccd0: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
cce0: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
ccf0: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
cd00: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
cd10: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
cd20: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
cd30: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
cd40: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
cd50: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
cd60: 70 61 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e  patible with Win
cd70: 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20 73  dows95 systems s
cd80: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
cd90: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
cda0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
cdb0: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
cdc0: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
cdd0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
cde0: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
cdf0: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
ce00: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
ce10: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
ce20: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
ce30: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
ce40: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
ce50: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
ce60: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
ce70: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
ce80: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
ce90: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
cea0: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
ceb0: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
cec0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
ced0: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
cee0: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
cef0: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
cf00: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
cf10: 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20  essful, 'shared 
cf20: 62 79 74 65 20 72 61 6e 67 65 27 20 69 73 20 72  byte range' is r
cf30: 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20  ead-locked.  ** 
cf40: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
cf50: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
cf60: 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c  e' released.  (L
cf70: 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65  egacy note:  Whe
cf80: 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61  n.  ** SQLite wa
cf90: 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65  s first develope
cfa0: 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73  d, Windows95 sys
cfb0: 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20  tems were still 
cfc0: 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a  very common,.  *
cfd0: 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20  * and Widnows95 
cfe0: 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c  lacks a shared-l
cff0: 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20  ock capability. 
d000: 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35   So on Windows95
d010: 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  , a.  ** single 
d020: 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
d030: 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73  d by from the 's
d040: 68 61 72 65 64 20 62 79 74 65 20 72 61 6e 67 65  hared byte range
d050: 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  ' is locked..  *
d060: 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e  * Windows95 is n
d070: 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68 20 65  ow pretty much e
d080: 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73  xtinct, but this
d090: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72   work-around for
d0a0: 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f   the.  ** lack o
d0b0: 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f  f shared-locks o
d0c0: 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65  n Windows95 live
d0d0: 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61  s on, for backwa
d0e0: 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69  rds.  ** compati
d0f0: 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20  bility.).  **.  
d100: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
d110: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
d120: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
d130: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
d140: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
d150: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
d160: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
d170: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
d180: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
d190: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
d1a0: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
d1b0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
d1c0: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
d1d0: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
d1e0: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
d1f0: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
d200: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d210: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
d220: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
d230: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
d240: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
d250: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
d260: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
d270: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
d280: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
d290: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
d2a0: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
d2b0: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
d2c0: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
d2d0: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
d2e0: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
d2f0: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
d300: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
d310: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
d320: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
d330: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
d340: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
d350: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
d360: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
d370: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
d380: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
d390: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
d3a0: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
d3b0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
d3c0: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
d3d0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
d3e0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
d3f0: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
d400: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
d410: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
d420: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
d430: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
d440: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
d450: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
d460: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
d470: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
d480: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
d490: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
d4a0: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20  tabase. .  */.  
d4b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d4c0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
d4d0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d4e0: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
d4f0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
d500: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d510: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
d520: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
d530: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d540: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
d550: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
d560: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
d570: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
d580: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
d590: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
d5a0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
d5b0: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
d5c0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
d5d0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
d5e0: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
d5f0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
d600: 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
d610: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
d620: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
d630: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
d640: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
d650: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
d660: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
d670: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
d680: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
d690: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
d6a0: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
d6b0: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
d6c0: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
d6d0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
d6e0: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
d6f0: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
d700: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
d710: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
d720: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
d730: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
d740: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
d750: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
d760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d770: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
d780: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
d790: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
d7a0: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
d7b0: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
d7c0: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
d7d0: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
d7e0: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
d7f0: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
d800: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
d810: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
d820: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
d830: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
d840: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
d850: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
d860: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
d870: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
d880: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d890: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
d8a0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
d8b0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
d8c0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
d8d0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
d8e0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d8f0: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
d900: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->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 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
d930: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
d940: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
d950: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
d960: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
d970: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
d980: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
d990: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
d9a0: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
d9b0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
d9c0: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
d9d0: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
d9e0: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
d9f0: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
da00: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
da10: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
da20: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
da30: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
da40: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
da50: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
da60: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
da70: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
da80: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
da90: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
daa0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
dab0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
dac0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
dad0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
dae0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
daf0: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
db00: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
db10: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
db20: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
db30: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
db40: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
db50: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
db60: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
db70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
db80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
db90: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
dba0: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
dbb0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
dbc0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
dbd0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dbe0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
dbf0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
dc00: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
dc10: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
dc20: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
dc30: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
dc40: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
dc50: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
dc60: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
dc70: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
dc80: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
dc90: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
dca0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
dcb0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
dcc0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
dcd0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
dce0: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
dcf0: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
dd00: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
dd10: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
dd20: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
dd30: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
dd40: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
dd50: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
dd60: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
dd70: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
dd80: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
dd90: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
dda0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ddb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
ddc0: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
ddd0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
dde0: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
ddf0: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
de00: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
de10: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
de20: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
de30: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
de40: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
de50: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
de60: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
de70: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
de80: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
de90: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
dea0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
deb0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
dec0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
ded0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
dee0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
def0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
df00: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
df10: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
df20: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
df30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
df40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
df50: 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
df60: 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
df70: 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
df80: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
df90: 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
dfa0: 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
dfb0: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
dfc0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
dfd0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
dfe0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
dff0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
e000: 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
e010: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e020: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
e030: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
e040: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
e050: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
e060: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
e070: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e080: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e090: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
e0a0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
e0b0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e0c0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e0d0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
e0e0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e0f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e100: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e110: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e120: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
e130: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  }..    /* Drop t
e140: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
e150: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
e160: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e170: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
e180: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
e190: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
e1a0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e1b0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e1c0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e1d0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
e1e0: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  K ){.      /* Th
e1f0: 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20  is could happen 
e200: 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d  with a network m
e210: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45  ount */.      tE
e220: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e230: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e240: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
e250: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
e260: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
e270: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e280: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e290: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e2a0: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e2b0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
e2c0: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
e2d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
e2e0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
e2f0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
e300: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
e310: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
e320: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
e330: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
e340: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e350: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
e360: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
e370: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
e380: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
e390: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
e3a0: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
e3b0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
e3c0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
e3d0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
e3e0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
e3f0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
e400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e410: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
e420: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
e430: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
e440: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
e450: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
e460: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
e470: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
e480: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
e490: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
e4a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
e4b0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e4c0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
e4d0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
e4e0: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
e4f0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e500: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e510: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e520: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
e530: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
e540: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
e550: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
e560: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
e570: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e580: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
e590: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
e5a0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
e5b0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e5c0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e5d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e5e0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e5f0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e600: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e610: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e620: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e630: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e640: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
e650: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
e660: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e670: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
e680: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e690: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
e6a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
e6b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e6c0: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
e6d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
e6e0: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
e6f0: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
e700: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
e710: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
e720: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
e730: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
e740: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
e750: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
e760: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
e770: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
e780: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
e790: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
e7a0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
e7b0: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
e7c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
e7d0: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
e7e0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
e7f0: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
e800: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
e810: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
e820: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
e830: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
e840: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
e850: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
e860: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
e870: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
e880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e890: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
e8a0: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
e8b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e8c0: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
e8d0: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
e8e0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
e8f0: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
e900: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e910: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
e920: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
e930: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
e940: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
e950: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
e960: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
e970: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
e980: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
e990: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
e9a0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
e9b0: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
e9c0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
e9d0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
e9e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e9f0: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
ea00: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
ea10: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
ea20: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
ea30: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
ea40: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
ea50: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
ea60: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
ea70: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
ea80: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
ea90: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
eaa0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
eab0: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e   *p = pFile->pUn
eac0: 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  used;.  p->pNext
ead0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73   = pInode->pUnus
eae0: 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55  ed;.  pInode->pU
eaf0: 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69  nused = p;.  pFi
eb00: 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46  le->h = -1;.  pF
eb10: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30  ile->pUnused = 0
eb20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
eb30: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
eb40: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
eb50: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
eb60: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
eb70: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
eb80: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
eb90: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
eba0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
ebb0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
ebc0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ebd0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
ebe0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
ebf0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
ec00: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
ec10: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
ec20: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c  .** .** If handl
ec30: 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72  eNFSUnlock is tr
ec40: 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e  ue, then on down
ec50: 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  grading an EXCLU
ec60: 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41  SIVE_LOCK to SHA
ec70: 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20  RED.** the byte 
ec80: 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64  range is divided
ec90: 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e   into 2 parts an
eca0: 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  d the first part
ecb0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65   is unlocked the
ecc0: 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65  n.** set to a re
ecd0: 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ad lock, then th
ece0: 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20  e other part is 
ecf0: 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  simply unlocked.
ed00: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a    This works .**
ed10: 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e   around a bug in
ed20: 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28   BSD NFS lockd (
ed30: 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63  also seen on Mac
ed40: 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20  OSX 10.3+) that 
ed50: 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d  fails to .** rem
ed60: 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ove the write lo
ed70: 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77  ck on a region w
ed80: 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
ed90: 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  is set..*/.stati
eda0: 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63  c int posixUnloc
edb0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
edc0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
edd0: 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53  k, int handleNFS
ede0: 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46  Unlock){.  unixF
edf0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ee00: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
ee10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
ee20: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
ee30: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
ee40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ee50: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
ee60: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
ee70: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
ee80: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
ee90: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
eea0: 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
eeb0: 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k,.      pFile->
eec0: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
eed0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
eee0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
eef0: 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
ef00: 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29     osGetpid(0)))
ef10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
ef20: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
ef30: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
ef40: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
ef50: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
ef60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ef70: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
ef80: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
ef90: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
efa0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
efb0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
efc0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
efd0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
efe0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
eff0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
f000: 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
f010: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69  eFileLock );..#i
f020: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
f030: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
f040: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
f050: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
f060: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
f070: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
f080: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f090: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
f0a0: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
f0b0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
f0c0: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
f0d0: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
f0e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
f0f0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
f100: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
f110: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
f120: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
f130: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
f140: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
f150: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
f160: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
f170: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
f180: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
f190: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
f1a0: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
f1b0: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
f1c0: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
f1d0: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
f1e0: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
f1f0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
f200: 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d     */.    pFile-
f210: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
f220: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
f230: 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74  /* downgrading t
f240: 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
f250: 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20  on NFS involves 
f260: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69  clearing the wri
f270: 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62  te lock.    ** b
f280: 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69  efore establishi
f290: 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20  ng the readlock 
f2a0: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63  - to avoid a rac
f2b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64  e condition we d
f2c0: 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20  owngrade.    ** 
f2d0: 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c  the lock in 2 bl
f2e0: 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61  ocks, so that pa
f2f0: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
f300: 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20  will be covered 
f310: 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69  by a .    ** wri
f320: 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  te lock until th
f330: 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65  e rest is covere
f340: 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b  d by a read lock
f350: 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b  :.    **  1:   [
f360: 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32  WWWWW].    **  2
f370: 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20  :   [....W].    
f380: 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d  **  3:   [RRRRW]
f390: 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52  .    **  4:   [R
f3a0: 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20  RRR.].    */.   
f3b0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f3c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23  SHARED_LOCK ){.#
f3d0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50  if !defined(__AP
f3e0: 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54  PLE__) || !SQLIT
f3f0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f400: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f  _STYLE.      (vo
f410: 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  id)handleNFSUnlo
f420: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
f430: 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
f440: 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23  k==0 );.#endif.#
f450: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
f460: 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
f470: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f480: 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68  TYLE.      if( h
f490: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
f4a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
f4b0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
f4c0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
f4d0: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
f4e0: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ll errors */.   
f4f0: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
f500: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
f510: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
f520: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f530: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f540: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f550: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f560: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f570: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f580: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f590: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
f5a0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f5b0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f5c0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f5d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f5e0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f5f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f600: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f610: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
f620: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
f630: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
f640: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f650: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f660: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f670: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
f680: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f690: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f6a0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f6b0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f6c0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
f6d0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
f6e0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f6f0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f700: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f720: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f730: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f740: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
f750: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
f760: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
f770: 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
f780: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
f790: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
f7a0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f7b0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f7c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f7d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f7e0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
f7f0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
f800: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f810: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f820: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f830: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
f840: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
f850: 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
f860: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f870: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
f880: 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
f890: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f8a0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f8b0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
f8c0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f8d0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f8e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f8f0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
f900: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f910: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f920: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
f930: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f950: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
f960: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f970: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f980: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
f990: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
f9a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f9b0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
f9c0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f9d0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f9e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f9f0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
fa00: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
fa10: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
fa20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
fa30: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
fa40: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
fa50: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
fa60: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
fa70: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
fa80: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
fa90: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
faa0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
fab0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
fac0: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
fad0: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
fae0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
faf0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
fb00: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
fb10: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
fb20: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
fb30: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
fb40: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
fb50: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
fb60: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
fb70: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
fb80: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
fb90: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
fba0: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
fbb0: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
fbc0: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
fbd0: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
fbe0: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
fbf0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
fc00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
fc10: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
fc20: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
fc30: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
fc40: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
fc50: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
fc60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fc70: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
fc80: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
fc90: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
fca0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
fcb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
fcc0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
fcd0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
fce0: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
fcf0: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
fd00: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
fd10: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
fd20: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
fd30: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
fd40: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
fd50: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
fd60: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
fd70: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
fd80: 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
fd90: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
fda0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74  rrno);.      got
fdb0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
fdc0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
fdd0: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
fde0: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
fdf0: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
fe00: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
fe10: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
fe20: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
fe30: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
fe40: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
fe50: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
fe60: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
fe70: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
fe80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
fe90: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
fea0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
feb0: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
fec0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
fed0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
fee0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
fef0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
ff00: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ff10: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
ff20: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
ff30: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
ff40: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
ff50: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ff60: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
ff70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ff80: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ff90: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
ffa0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
ffb0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
ffc0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49  rno);.        pI
ffd0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
ffe0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
fff0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10000 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
10010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10020 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
10030 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
10040 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
10050 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
10060 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
10070 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
10080 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
10090 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
100a0 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
100b0 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
100c0 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
100d0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
100e0 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
100f0 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
10100 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
10110 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
10120 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
10130 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
10140 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
10150 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65  e);.    }.  }..e
10160 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
10170 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
10180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10190 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
101a0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
101b0 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
101c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
101d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
101e0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
101f0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
10200 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
10210 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
10220 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
10230 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
10240 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
10250 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
10260 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10270 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
10280 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
10290 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
102a0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
102b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
102c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
102d0 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
102e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
102f0 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51  ileLock){.#if SQ
10300 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
10310 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65  ZE>0.  assert( e
10320 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
10330 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46  _LOCK || ((unixF
10340 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63  ile *)id)->nFetc
10350 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut==0 );.#endi
10360 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  f.  return posix
10370 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
10380 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Lock, 0);.}..#if
10390 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
103a0 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
103b0 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
103c0 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
103d0 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63  4 nByte);.static
103e0 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
103f0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
10400 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d);.#endif../*.*
10410 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10420 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
10430 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
10440 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
10450 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
10460 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
10470 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
10480 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
10490 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
104a0 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
104b0 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
104c0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
104d0 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
104e0 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
104f0 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
10500 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
10510 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
10520 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10530 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
10540 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
10550 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
10560 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
10570 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
10580 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
10590 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
105a0 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
105b0 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
105c0 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
105d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
105e0 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53  xFile*)id;.#if S
105f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
10600 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61  IZE>0.  unixUnma
10610 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
10620 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
10630 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
10640 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
10650 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
10660 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
10670 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
10680 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
10690 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
106a0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
106b0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
106c0 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
106d0 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
106e0 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
106f0 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
10700 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
10710 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
10720 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
10730 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
10740 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10750 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
10760 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69  _CLOSE.  if( pFi
10770 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
10780 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
10790 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  ){.    osUnlink(
107a0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
107b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
107c0 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d  *(char**)&pFile-
107d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
107e0 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20  le->zPath = 0;. 
107f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
10800 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
10810 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
10820 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
10830 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
10840 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
10850 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
10860 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
10870 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
10880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10890 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
108a0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
108b0 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
108c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
108d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
108e0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
108f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10900 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65  xFile *)id;.  ve
10910 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65  rifyDbFile(pFile
10920 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  );.  unixUnlock(
10930 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
10940 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
10950 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
10960 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
10970 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
10980 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
10990 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
109a0 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
109b0 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
109c0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
109d0 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
109e0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
109f0 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
10a00 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
10a10 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
10a20 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
10a30 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
10a40 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
10a50 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
10a60 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
10a70 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
10a80 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
10a90 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
10aa0 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
10ab0 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
10ac0 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
10ad0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
10ae0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
10af0 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
10b00 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
10b10 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
10b20 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
10b30 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
10b40 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
10b50 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
10b60 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
10b70 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
10b80 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
10b90 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
10ba0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
10bb0 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
10bc0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
10bd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
10be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10bf0 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
10c00 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
10c10 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
10c80 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a  ***********.****
10cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
10cf0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
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 0a 2a 2a 0a 2a  ***********.**.*
10d20 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
10d30 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
10d40 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
10d50 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
10d60 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
10d70 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
10d80 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
10d90 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
10da0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10db0 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
10dc0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
10dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
10de0 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
10df0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
10e00 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
10e10 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
10e20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
10e30 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
10e40 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
10e50 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
10e60 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
10e70 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
10e80 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
10e90 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
10ea0 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
10eb0 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
10ec0 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
10ed0 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
10ee0 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
10ef0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
10f00 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
10f10 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
10f20 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
10f30 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
10f40 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
10f50 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
10f60 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
10f70 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10f80 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
10f90 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
10fa0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
10fb0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
10fc0 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
10fd0 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
10fe0 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
10ff0 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
11000 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
11010 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
11020 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
11030 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
11040 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11050 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
11060 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
11070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11080 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
11090 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
110a0 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
110b0 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
110c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
110d0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
110e0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
110f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
11100 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
11110 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
11120 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
11130 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
11140 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
11150 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
11160 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11170 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11180 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
11190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
111a0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
111b0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
111c0 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
111d0 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
111e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111f0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
11200 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
11210 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
11220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
11230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
11280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
112d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112e0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
112f0 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
11300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11320 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
11330 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
11340 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
11350 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70  existence of sep
11360 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
11370 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69  les (really a di
11380 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74  rectory) to cont
11390 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
113a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
113b0 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75  s works.** on ju
113c0 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  st about every f
113d0 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
113e0 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
113f0 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
11400 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
11410 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
11420 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
11430 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
11440 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
11450 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
11460 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
11470 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
11480 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
11490 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
114a0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
114b0 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
114c0 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
114d0 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
114e0 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
114f0 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
11500 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
11510 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
11520 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
11530 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
11540 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
11550 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
11560 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
11570 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
11580 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
11590 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
115a0 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
115b0 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72  ng a subdirector
115c0 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  y in the same di
115d0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
115e0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  e database and w
115f0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
11600 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
11610 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
11620 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
11630 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stence of a lock
11640 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69   directory impli
11650 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
11660 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
11670 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28  .** lock types (
11680 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
11690 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
116a0 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
116b0 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
116c0 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
116d0 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
116e0 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
116f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
11700 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64  te the.** lock d
11710 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65  irectory..*/.#de
11720 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
11730 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
11740 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11750 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
11760 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
11770 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
11780 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
11790 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
117a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
117b0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
117c0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
117d0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
117e0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
117f0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11800 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
11810 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
11820 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
11830 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
11840 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
11850 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
11860 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
11870 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11880 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
11890 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
118a0 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
118b0 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
118c0 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
118d0 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
118e0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
118f0 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
11900 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
11910 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
11920 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11930 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
11940 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
11950 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
11960 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11970 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
11980 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11990 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
119a0 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
119b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
119c0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
119d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
119e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
119f0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
11a00 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
11a10 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11a20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41    reserved = osA
11a30 63 63 65 73 73 28 28 63 6f 6e 73 74 20 63 68 61  ccess((const cha
11a40 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
11a50 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30 3b  gContext, 0)==0;
11a60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
11a70 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
11a80 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
11a90 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
11aa0 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52  eserved));.  *pR
11ab0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
11ac0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11ad0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
11ae0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
11af0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
11b00 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
11b10 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
11b20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
11b30 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
11b40 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
11b50 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
11b60 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
11b70 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
11b80 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
11b90 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
11ba0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
11bb0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
11bc0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
11bd0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
11be0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
11bf0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
11c00 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
11c10 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
11c20 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
11c30 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
11c40 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
11c50 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
11c60 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
11c70 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
11c80 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
11c90 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
11ca0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
11cb0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
11cc0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
11cd0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
11ce0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
11cf0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
11d00 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
11d10 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
11d20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
11d30 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
11d40 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
11d50 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11d60 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11d70 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
11d80 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
11d90 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
11da0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
11db0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
11dc0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
11dd0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
11de0 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
11df0 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f  l..**.** With do
11e00 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77  tfile locking, w
11e10 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75  e really only su
11e20 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a  pport state (4):
11e30 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42   EXCLUSIVE..** B
11e40 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65 20  ut we track the 
11e50 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65  other locking le
11e60 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  vels internally.
11e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11e80 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  otlockLock(sqlit
11e90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11ea0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
11eb0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11ec0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11ed0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
11ee0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11ef0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11f00 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  xt;.  int rc = S
11f10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
11f20 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   If we have any 
11f30 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c  lock, then the l
11f40 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79  ock file already
11f50 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65   exists.  All we
11f60 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
11f70 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69   is adjust our i
11f80 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
11f90 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c  f the lock level
11fa0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
11fb0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
11fc0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  NO_LOCK ){.    p
11fd0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11fe0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
11ff0 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74   /* Always updat
12000 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20  e the timestamp 
12010 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20  on the old file 
12020 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  */.#ifdef HAVE_U
12030 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a  TIME.    utime(z
12040 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
12050 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65  .#else.    utime
12060 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  s(zLockFile, NUL
12070 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  L);.#endif.    r
12080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12090 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
120a0 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
120b0 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73  ock */.  rc = os
120c0 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c  Mkdir(zLockFile,
120d0 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63   0777);.  if( rc
120e0 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69  <0 ){.    /* fai
120f0 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61  led to open/crea
12100 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65  te the lock dire
12110 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74  ctory */.    int
12120 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12130 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54 20  .    if( EEXIST 
12140 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  == tErrno ){.   
12150 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12160 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  USY;.    } else 
12170 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
12180 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12190 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
121a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
121b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
121c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
121d0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
121e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
121f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rrno);.      }. 
12200 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12210 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a  rc;.  } .  .  /*
12220 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
12230 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
12240 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
12250 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12260 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
12270 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
12280 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
12290 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
122a0 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
122b0 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
122c0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
122d0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
122e0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
122f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
12300 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
12310 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
12320 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
12330 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
12340 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
12350 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
12360 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
12370 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  p..**.** When th
12380 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12390 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c  reaches NO_LOCK,
123a0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
123b0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
123c0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f   int dotlockUnlo
123d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
123e0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
123f0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
12400 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12410 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
12420 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
12430 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
12440 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
12450 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
12460 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
12470 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
12480 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
12490 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
124a0 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
124b0 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
124c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
124d0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
124e0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
124f0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
12500 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
12510 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
12520 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12530 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
12540 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
12550 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12560 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
12570 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
12580 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
12590 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
125a0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
125b0 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
125c0 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
125d0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
125e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
125f0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
12600 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
12610 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
12620 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
12630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12640 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
12650 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
12660 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
12670 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
12680 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
12690 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
126a0 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72  ;.  rc = osRmdir
126b0 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
126c0 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
126d0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
126e0 6f 3b 0a 20 20 20 20 69 66 28 20 74 45 72 72 6e  o;.    if( tErrn
126f0 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  o==ENOENT ){.   
12700 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
12710 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
12720 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12730 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
12740 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
12750 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
12760 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
12770 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
12780 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12790 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
127a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
127b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
127c0 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
127d0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
127e0 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
127f0 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
12800 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
12810 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
12820 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69  ile *id) {.  uni
12830 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12840 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
12850 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12860 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
12870 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
12880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
12890 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
128a0 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ext);.  return c
128b0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
128c0 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
128d0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
128e0 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
128f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
12920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12960 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
12970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129b0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
129c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
129d0 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
129e0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
129f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a00 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
12a10 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
12a20 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
12a30 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
12a40 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
12a50 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
12a60 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
12a70 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
12a80 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
12a90 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
12aa0 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
12ab0 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
12ac0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
12ad0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
12ae0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
12af0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
12b00 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
12b10 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
12b20 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
12b30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
12b40 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
12b50 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
12b60 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
12b70 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
12b80 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
12b90 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
12ba0 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
12bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
12bc0 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
12bd0 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
12be0 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
12bf0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
12c00 69 73 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f  is turned off.*/
12c10 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
12c20 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
12c30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c  ../*.** Retry fl
12c40 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ock() calls that
12c50 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52   fail with EINTR
12c60 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52  .*/.#ifdef EINTR
12c70 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
12c80 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c  st_flock(int fd,
12c90 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20   int op){.  int 
12ca0 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66  rc;.  do{ rc = f
12cb0 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68  lock(fd,op); }wh
12cc0 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
12cd0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
12ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
12cf0 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73  e.# define robus
12d00 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f  t_flock(a,b) flo
12d10 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20  ck(a,b).#endif. 
12d20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
12d30 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
12d40 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
12d50 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
12d60 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
12d70 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
12d80 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
12d90 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
12da0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
12db0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
12dc0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
12dd0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
12de0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
12df0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
12e00 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
12e10 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
12e20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
12e30 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
12e40 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
12e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12e60 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
12e70 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
12e80 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
12e90 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
12ea0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12eb0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
12ec0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12ed0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12ee0 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
12ef0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
12f00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
12f10 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
12f20 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
12f30 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f   pFile );.  .  /
12f40 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
12f50 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
12f60 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
12f70 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
12f80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
12f90 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
12fa0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
12fb0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
12fc0 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
12fd0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
12fe0 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
12ff0 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
13000 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20  .    /* attempt 
13010 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
13020 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
13030 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
13040 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
13050 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20  | LOCK_NB);.    
13060 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20  if( !lrc ){.    
13070 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63    /* got the loc
13080 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a  k, unlock it */.
13090 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75        lrc = robu
130a0 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
130b0 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20  h, LOCK_UN);.   
130c0 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a     if ( lrc ) {.
130d0 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
130e0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
130f0 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61      /* unlock fa
13100 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  iled with an err
13110 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72  or */.        lr
13120 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
13130 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20  _UNLOCK; .      
13140 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
13150 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
13160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
13170 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
13180 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
13190 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
131a0 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
131b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
131c0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
131d0 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
131e0 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
131f0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
13200 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
13210 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
13220 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
13230 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
13240 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
13250 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
13260 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
13270 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
13280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13290 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
132a0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
132b0 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
132c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
132d0 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
132e0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
132f0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
13300 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
13310 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
13320 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
13330 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13340 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
13350 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
13360 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
13370 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13380 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
13390 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
133a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
133b0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
133c0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
133d0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
133e0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
133f0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
13400 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
13410 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
13420 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
13430 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
13440 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
13450 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
13460 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
13470 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
13480 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
13490 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
134a0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
134b0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
134c0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
134d0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
134e0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
134f0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
13500 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
13510 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
13520 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
13530 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
13540 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
13550 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
13560 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
13570 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
13580 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
13590 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
135a0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
135b0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
135c0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
135d0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
135e0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
135f0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
13600 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13610 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
13620 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
13630 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13640 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
13650 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
13660 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
13670 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
13680 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
13690 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
136a0 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
136b0 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
136c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
136d0 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
136e0 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
136f0 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
13700 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
13710 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
13720 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
13730 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
13740 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
13750 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13760 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
13770 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
13780 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
13790 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
137a0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
137b0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
137c0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
137d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
137e0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
137f0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
13800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
13810 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13820 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
13830 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13840 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
13850 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
13860 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
13870 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
13880 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
13890 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
138a0 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
138b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
138c0 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
138d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
138e0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
138f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13900 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13910 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
13920 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
13930 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
13940 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
13950 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
13960 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
13970 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
13980 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
13990 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
139a0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
139b0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
139c0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
139d0 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
139e0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
139f0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74  (rc) ){.      st
13a00 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
13a10 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
13a20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
13a30 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13a40 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13a50 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
13a60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13a70 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
13a80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
13a90 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66  K    %d %s %s (f
13aa0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
13ab0 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
13ac0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
13ad0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
13ae0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
13af0 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66  ailed"));.#ifdef
13b00 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13b10 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13b20 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
13b30 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
13b40 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
13b50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
13b60 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
13b70 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
13b80 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13b90 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
13ba0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
13bb0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13bc0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13bd0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
13be0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
13bf0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
13c00 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
13c10 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
13c20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
13c30 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13c40 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13c50 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
13c60 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
13c70 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
13c80 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
13c90 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13cb0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
13cc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13cd0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13ce0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13cf0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13d00 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
13d10 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
13d20 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
13d30 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
13d40 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
13d50 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
13d60 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13d70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73  e->eFileLock, os
13d80 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61  Getpid(0)));.  a
13d90 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
13da0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
13db0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
13dc0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
13dd0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13de0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
13df0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13e00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13e10 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
13e20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
13e30 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
13e40 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
13e50 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
13e60 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
13e70 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
13e80 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13e90 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
13ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13eb0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
13ec0 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
13ed0 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if( robust_flock
13ee0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
13ef0 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51  UN) ){.#ifdef SQ
13f00 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13f10 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
13f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f30 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  OK;.#endif /* SQ
13f40 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13f50 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
13f60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13f70 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
13f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
13f90 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13fa0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65   NO_LOCK;.    re
13fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13fc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
13fd0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
13fe0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c  atic int flockCl
13ff0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
14000 20 2a 69 64 29 20 7b 0a 20 20 61 73 73 65 72 74   *id) {.  assert
14010 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c 6f  ( id!=0 );.  flo
14020 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
14030 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20  LOCK);.  return 
14040 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
14050 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
14060 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
14070 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
14080 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
140b0 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
140c0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
140d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14190 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
141a0 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
141b0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
141c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
141d0 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
141e0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
141f0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
14200 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
14210 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
14220 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
14230 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
14240 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
14250 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
14260 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
14270 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
14280 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
14290 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
142a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
142b0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
142c0 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
142d0 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
142e0 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
142f0 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
14300 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
14310 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
14320 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
14330 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
14340 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
14350 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
14360 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
14370 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
14380 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
14390 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
143a0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
143b0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
143c0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
143d0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
143e0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
143f0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
14400 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
14410 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
14420 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
14430 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14440 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
14450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14460 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65  semXCheckReserve
14470 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
14480 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
14490 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
144a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
144b0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
144c0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
144d0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
144e0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
144f0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
14500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
14510 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
14520 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
14530 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
14540 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
14550 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
14560 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
14570 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
14580 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
14590 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
145a0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
145b0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
145c0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
145d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
145e0 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
145f0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
14600 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14610 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14620 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Sem;..    if( se
14630 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
14640 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
14650 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
14660 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
14670 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
14680 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14690 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
146a0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
146b0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
146c0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
146d0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
146e0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
146f0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rno);.      } el
14700 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
14710 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
14720 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
14730 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
14740 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
14750 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65  rved = (pFile->e
14760 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45  FileLock < SHARE
14770 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
14780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14790 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
147a0 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
147b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
147c0 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
147d0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
147e0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
147f0 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e  %d %d %d (sem)\n
14800 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
14810 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
14820 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
14830 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
14840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
14850 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
14860 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
14870 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
14880 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
14890 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
148a0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
148b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
148c0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
148d0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
148e0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
148f0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
14900 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
14910 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
14920 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
14930 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
14940 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
14950 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
14960 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
14970 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
14980 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
14990 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
149a0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
149b0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
149c0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
149d0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
149e0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
149f0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
14a00 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
14a10 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
14a20 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
14a30 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
14a40 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
14a50 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
14a60 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
14a70 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
14a80 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
14a90 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
14aa0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
14ab0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
14ac0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14ad0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14ae0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
14af0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
14b00 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
14b10 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
14b20 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
14b30 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
14b40 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
14b50 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
14b60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
14b70 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
14b80 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
14b90 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
14ba0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
14bb0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
14bc0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
14bd0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
14be0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
14bf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14c00 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
14c10 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
14c20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
14c30 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
14c40 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14c50 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
14c60 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f 63  atic int semXLoc
14c70 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14c80 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
14c90 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
14ca0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14cb0 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
14cc0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
14cd0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69  Inode->pSem;.  i
14ce0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14cf0 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
14d00 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
14d10 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
14d20 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
14d30 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
14d40 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
14d50 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
14d60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14d70 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
14d80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14d90 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
14da0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14db0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  K;.    goto sem_
14dc0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
14dd0 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70  .  /* lock semap
14de0 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69  hore now but bai
14df0 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61  l out when alrea
14e00 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  dy locked. */.  
14e10 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
14e20 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
14e30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14e40 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  Y;.    goto sem_
14e50 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
14e60 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
14e70 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
14e80 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
14e90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14ea0 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f  FileLock;.. sem_
14eb0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75  end_lock:.  retu
14ec0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14ed0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
14ee0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
14ef0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14f00 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14f10 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14f20 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14f30 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14f40 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14f50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14f60 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14f70 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14f80 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
14f90 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
14fa0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
14fb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
14fc0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
14fd0 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 73  int semXUnlock(s
14fe0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14ff0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
15000 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
15010 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
15020 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
15030 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
15040 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  de->pSem;..  ass
15050 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15060 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
15070 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
15080 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
15090 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22   pid=%d (sem)\n"
150a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
150b0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
150c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
150d0 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  ck, osGetpid(0))
150e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
150f0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
15100 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
15110 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
15120 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15130 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
15140 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
15150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15160 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
15170 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
15180 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
15190 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
151a0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
151b0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
151c0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
151d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
151e0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
151f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15200 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
15210 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20   really unlock. 
15220 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f  */.  if ( sem_po
15230 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b  st(pSem)==-1 ) {
15240 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72  .    int rc, tEr
15250 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
15260 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
15270 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
15280 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
15290 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
152a0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
152b0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
152c0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
152d0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
152e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
152f0 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
15300 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
15310 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
15320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15330 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
15340 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
15350 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71 6c  nt semXClose(sql
15360 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
15370 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
15380 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15390 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
153a0 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63 6b  ;.    semXUnlock
153b0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
153c0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
153d0 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
153e0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
153f0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
15400 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
15410 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
15420 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
15430 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
15440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
15450 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
15460 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
15470 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
15480 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
15490 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
154a0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
154b0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
154c0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
154d0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
154e0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
154f0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15540 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
15550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15590 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
155a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155b0 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
155c0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
155d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
155f0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
15600 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
15610 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
15620 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
15630 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
15640 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
15650 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
15660 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
15670 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
15680 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
15690 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
156a0 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
156b0 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
156c0 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
156d0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
156e0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
156f0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
15700 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
15710 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
15720 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
15730 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
15740 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
15750 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
15760 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
15770 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
15780 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
15790 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
157a0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
157b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
157c0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
157d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
157e0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
157f0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
15800 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  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 3b 20 20 20 20 20 20 20 20   offset;        
15830 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
15840 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
15850 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15860 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
15870 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
15880 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
15890 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
158a0 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
158b0 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
158c0 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
158d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
158e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
158f0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
15900 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
15910 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
15920 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15930 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
15940 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
15950 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
15960 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
15970 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
159a0 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
159b0 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
159c0 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
159d0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
159e0 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
159f0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
15a00 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
15a10 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
15a20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
15a30 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
15a40 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
15a50 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
15a60 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
15a70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15a80 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
15a90 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
15aa0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
15ab0 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
15ac0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
15ad0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
15ae0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15af0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
15b00 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
15b10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15b20 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
15b30 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
15b40 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
15b50 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
15b60 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
15b70 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
15b80 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
15b90 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
15ba0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
15bb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15bc0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
15bd0 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
15be0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
15bf0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
15c00 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
15c10 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
15c20 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
15c30 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
15c40 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
15c50 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
15c60 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
15c70 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
15c80 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
15c90 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
15ca0 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
15cb0 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
15cc0 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
15cd0 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
15ce0 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
15cf0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
15d00 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
15d10 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
15d20 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
15d30 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
15d40 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
15d50 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
15d60 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
15d70 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
15d80 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15d90 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
15da0 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
15db0 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
15dc0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
15dd0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
15de0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
15df0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
15e00 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
15e10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15e20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
15e30 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
15e40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15e50 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
15e60 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
15e70 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
15e80 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
15e90 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
15ea0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
15ed0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
15ee0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
15ef0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
15f00 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
15f10 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
15f20 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
15f30 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
15f40 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
15f50 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
15f60 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
15f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
15f80 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
15f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15fb0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
15fc0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
15fd0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
15fe0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
15ff0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
16000 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
16010 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
16020 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
16030 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
16040 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
16050 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
16060 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
16070 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
16080 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
16090 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
160a0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
160b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
160c0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
160d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
160e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
160f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16100 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
16110 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
16130 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
16140 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16150 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16160 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
16170 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
16180 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
16190 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
161a0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
161b0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
161c0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
161d0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
161e0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
161f0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
16200 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
16210 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
16220 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
16230 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
16240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16250 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
16260 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
16270 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
16280 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
16290 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
162a0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
162b0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
162c0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
162d0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
162e0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
162f0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
16300 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
16310 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
16320 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
16330 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
16340 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
16350 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
16360 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
16370 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
16380 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
16390 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
163a0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
163b0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
163c0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
163d0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
163e0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
163f0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
16400 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
16410 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
16420 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
16430 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
16440 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
16450 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
16460 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
16470 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
16480 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
16490 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
164a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
164b0 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
164c0 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
164d0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
164e0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
164f0 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
16500 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
16510 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
16520 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
16530 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
16540 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
16550 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
16560 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
16570 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
16580 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
16590 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
165a0 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
165b0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
165c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
165d0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
165e0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
165f0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
16600 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
16610 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
16620 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
16630 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
16640 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
16650 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
16660 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
16670 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
16680 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
16690 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
166a0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
166b0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
166c0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
166d0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
166e0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
166f0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
16700 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
16710 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
16720 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16730 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16740 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
16750 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
16760 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
16770 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
16780 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
16790 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
167a0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
167b0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
167c0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
167d0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
167e0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
167f0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
16800 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
16810 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
16820 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16830 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16840 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
16850 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16860 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
16870 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
16880 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16890 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
168a0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
168b0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
168c0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
168d0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
168e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
168f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
16900 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16910 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
16920 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
16930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16940 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
16950 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
16960 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
16970 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
16980 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
16990 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
169a0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
169b0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
169c0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
169d0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
169e0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
169f0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16a00 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
16a10 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
16a20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
16a30 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16a40 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
16a50 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
16a60 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
16a70 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16a80 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
16a90 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
16aa0 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70 69  Shared , osGetpi
16ab0 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  d(0)));..  /* If
16ac0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
16ad0 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
16ae0 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
16af0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
16b00 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
16b10 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
16b20 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
16b30 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
16b40 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
16b50 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
16b60 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
16b70 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
16b80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
16b90 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
16ba0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
16bb0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
16bc0 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
16bd0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
16be0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16bf0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16c00 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
16c10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
16c20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16c30 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
16c40 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
16c50 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
16c60 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
16c70 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
16c80 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
16c90 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
16ca0 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
16cb0 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
16cc0 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
16cd0 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
16ce0 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
16cf0 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
16d00 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
16d10 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
16d20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16d30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
16d40 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
16d50 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16d60 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
16d70 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
16d80 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16d90 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
16da0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
16db0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
16dc0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16dd0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
16de0 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
16df0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
16e00 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
16e10 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
16e20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16e30 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
16e40 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
16e50 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
16e60 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
16e70 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
16e80 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
16e90 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
16ea0 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
16eb0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
16ec0 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
16ed0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
16ee0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
16ef0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16f00 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
16f10 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
16f20 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
16f30 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
16f40 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
16f50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16f60 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
16f70 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
16f80 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
16f90 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
16fa0 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
16fb0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
16fc0 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
16fd0 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
16fe0 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
16ff0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
17000 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
17010 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
17020 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
17030 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
17040 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17050 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
17060 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
17070 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
17080 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
17090 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
170a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
170b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
170c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
170d0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
170e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
170f0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
17100 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
17110 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17120 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
17130 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
17140 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
17150 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
17160 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17170 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
17180 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
17190 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
171a0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
171b0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
171c0 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
171d0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
171e0 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
171f0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
17200 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
17210 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
17220 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
17230 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17240 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
17250 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
17260 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
17270 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
17280 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
17290 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
172a0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
172b0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
172c0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
172d0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
172e0 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
172f0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
17300 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
17310 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
17320 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
17330 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
17340 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
17350 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
17360 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
17370 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
17380 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
17390 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
173a0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
173b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
173c0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
173d0 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
173e0 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
173f0 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
17400 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
17410 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17420 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
17430 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
17440 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
17450 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
17460 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
17470 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
17480 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
17490 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
174a0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
174b0 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
174c0 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
174d0 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
174e0 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
174f0 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
17500 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
17510 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
17520 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17530 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
17540 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
17550 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
17560 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17570 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17580 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
17590 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
175a0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
175b0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
175c0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
175d0 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
175e0 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
175f0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
17600 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
17610 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
17620 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
17630 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17640 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17650 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
17660 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
17670 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
17680 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
17690 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
176a0 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72  no(pFile, lrc1Er
176b0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rno);.      rc =
176c0 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
176d0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
176e0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
176f0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
17700 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
17710 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
17720 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
17730 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
17740 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
17750 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
17760 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
17770 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
17780 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
17790 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
177a0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
177b0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
177c0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
177d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
177e0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
177f0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
17800 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
17810 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
17820 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
17830 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
17840 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
17850 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
17860 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
17870 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
17880 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
17890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
178a0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
178b0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
178c0 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
178d0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
178e0 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
178f0 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
17900 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
17910 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
17920 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
17930 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
17940 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
17950 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
17960 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
17970 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
17980 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
17990 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
179a0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
179b0 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
179c0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
179d0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
179e0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
179f0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17a00 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17a10 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17a20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17a30 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
17a40 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17a50 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
17a60 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
17a70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
17a80 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
17a90 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
17aa0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
17ab0 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
17ac0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
17ad0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
17ae0 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
17af0 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
17b00 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
17b10 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
17b20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
17b30 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
17b40 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
17b50 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
17b60 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
17b70 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
17b80 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17b90 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17ba0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
17bb0 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17bd0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17be0 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
17bf0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
17c00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17c10 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
17c20 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
17c30 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
17c40 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
17c50 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
17c60 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17c70 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17c80 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
17cb0 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
17cc0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
17cd0 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
17ce0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17cf0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17d20 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
17d30 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
17d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
17d50 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
17d60 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
17d70 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
17d80 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
17d90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
17da0 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
17db0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
17dc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
17dd0 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
17de0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
17df0 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
17e00 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
17e10 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
17e20 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
17e30 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17e40 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
17e50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17e60 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
17e70 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
17e80 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
17e90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
17ea0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
17eb0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
17ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
17ed0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17ee0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
17ef0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17f00 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17f10 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17f20 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17f30 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
17f40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
17f50 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
17f60 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17f70 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17f80 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
17f90 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
17fa0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
17fb0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
17fc0 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
17fd0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
17fe0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
17ff0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
18000 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
18010 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
18020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18030 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
18040 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
18050 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18060 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
18070 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
18080 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
18090 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
180a0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
180b0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
180c0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
180d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
180e0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
180f0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
18100 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
18110 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
18120 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
18130 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
18140 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
18150 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
18160 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
18170 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
18180 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
18190 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
181a0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
181b0 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
181c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
181d0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
181e0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
181f0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
18200 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
18210 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
18220 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18230 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
18240 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
18250 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
18260 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
18270 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
18280 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
18290 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
182a0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
182b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
182c0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
182d0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
182e0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
182f0 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
18300 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29       osGetpid(0)
18310 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
18320 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
18330 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
18340 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
18350 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
18360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18370 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
18380 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
18390 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
183a0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
183b0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
183c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
183d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
183e0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
183f0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18400 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
18410 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
18420 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18430 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
18440 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18450 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
18460 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18470 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
18480 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
18490 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
184a0 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
184b0 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
184c0 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
184d0 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
184e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
184f0 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
18500 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
18510 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
18520 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
18530 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
18540 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
18550 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
18560 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
18570 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
18580 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
18590 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
185a0 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
185b0 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
185c0 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
185d0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
185e0 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
185f0 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
18600 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
18610 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
18620 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
18630 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
18640 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
18650 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
18660 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18670 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
18680 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
18690 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
186a0 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
186b0 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
186c0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
186d0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
186e0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
186f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
18700 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18710 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
18720 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
18730 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18740 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18750 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
18760 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
18770 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
18780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18790 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
187a0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
187b0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
187c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
187d0 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
187e0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
187f0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
18800 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
18810 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
18820 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18830 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
18840 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18850 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18860 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
18870 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
18880 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
18890 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
188a0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
188b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
188c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
188d0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
188e0 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
188f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18900 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18910 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18920 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18930 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
18940 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18950 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
18960 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
18970 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
18980 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
18990 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
189a0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
189b0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
189c0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
189d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
189e0 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
189f0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
18a00 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
18a10 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18a20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18a30 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18a40 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18a50 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
18a60 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
18a70 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18a80 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
18a90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18aa0 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
18ab0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
18ac0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
18ad0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
18ae0 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
18af0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
18b00 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
18b10 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
18b20 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
18b30 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
18b40 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
18b50 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
18b60 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
18b70 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
18b80 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
18b90 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
18ba0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
18bb0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
18bc0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
18bd0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
18be0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18bf0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18c00 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18c10 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
18c20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18c30 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18c40 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
18c50 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
18c60 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18c70 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18c80 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
18c90 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
18ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18cb0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
18cc0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
18cd0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
18ce0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
18cf0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
18d30 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
18d40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
18d50 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
18d60 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
18d70 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
18d80 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64         closePend
18d90 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
18da0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18db0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
18dc0 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
18dd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
18de0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18df0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
18e00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18e10 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
18e20 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
18e30 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
18e40 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
18e50 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
18e60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
18e70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18e80 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
18e90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18ea0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
18eb0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
18ec0 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
18ed0 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
18ee0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
18ef0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
18f00 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
18f10 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
18f20 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
18f30 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
18f40 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
18f50 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
18f60 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
18f70 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
18f80 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
18f90 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
18fa0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
18fb0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
18fc0 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64  to pInode->aPend
18fd0 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
18fe0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
18ff0 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a  losed when.    *
19000 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
19010 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
19020 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e  */.    setPendin
19030 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  gFd(pFile);.  }.
19040 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
19050 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  fo(pFile);.  sql
19060 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
19070 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
19080 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
19090 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
190a0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
190b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
190c0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
190d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
190e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
190f0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
19100 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
19110 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
19120 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
19130 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
19140 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
19150 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
19160 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
19170 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
19180 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
19190 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
191a0 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
191b0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
191c0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
191d0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
191e0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
191f0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
19200 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
19210 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
19220 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
19230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19240 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19290 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
192a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192e0 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
19310 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
19320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19330 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
19340 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
19350 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
19360 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
19370 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
19380 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
19390 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
193a0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
193b0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
193c0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
193d0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
193e0 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
193f0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
19400 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
19410 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
19420 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
19430 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
19440 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
19450 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
19460 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
19470 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
19480 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
19490 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
194a0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
194b0 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
194c0 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a   eFileLock, 1);.
194d0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
194e0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
194f0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
19500 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
19510 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
19520 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
19530 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
19540 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
19550 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
19560 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
19570 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
19580 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
19590 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
195a0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
195b0 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
195c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195d0 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
195e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
195f0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
19600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
19660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
196b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
196c0 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
196d0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
196e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
19700 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
19710 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
19720 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
19730 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
19740 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
19750 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
19760 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
19770 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
19780 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
19790 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
197a0 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
197b0 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
197c0 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
197d0 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
197e0 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
197f0 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
19800 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
19810 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
19820 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
19830 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
19840 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
19850 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
19860 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19870 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
19880 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
19890 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
198a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
198b0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
198c0 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
198d0 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
198e0 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
198f0 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
19900 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
19910 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
19920 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
19930 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
19940 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
19950 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
19960 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
19970 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
19980 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
19990 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79  * in any form by
199a0 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
199b0 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
199c0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
199d0 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
199e0 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
199f0 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
19a00 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
19a10 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
19a20 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
19a30 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
19a40 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
19a50 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
19a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
19a70 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
19a80 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
19a90 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
19aa0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
19ab0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
19ac0 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a   int prior = 0;.
19ad0 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
19ae0 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
19af0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
19b00 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
19b10 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
19b20 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65  ER_START;.  asse
19b30 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78  rt( cnt==(cnt&0x
19b40 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65  1ffff) );.  asse
19b50 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20  rt( id->h>2 );. 
19b60 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
19b70 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20  (USE_PREAD).    
19b80 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64  got = osPread(id
19b90 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
19ba0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
19bb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
19bc0 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
19bd0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19be0 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  D64).    got = o
19bf0 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20  sPread64(id->h, 
19c00 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19c10 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
19c20 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
19c30 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e  1 );.#else.    n
19c40 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
19c50 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
19c60 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53  SEEK_SET);.    S
19c70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19c80 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20 29  newOffset = -1 )
19c90 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
19ca0 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  set<0 ){.      s
19cb0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
19cc0 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
19cd0 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
19ce0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
19cf0 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
19d00 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
19d10 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
19d20 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
19d30 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
19d40 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
19d50 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
19d60 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
19d70 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
19d80 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
19d90 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
19da0 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20  *)id,  errno);. 
19db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19dc0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
19dd0 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
19de0 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
19df0 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
19e00 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
19e10 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
19e20 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
19e30 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
19e40 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
19e50 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
19e60 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
19e70 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
19e80 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
19e90 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
19ea0 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
19eb0 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
19ec0 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
19ed0 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
19ee0 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
19ef0 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
19f00 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
19f10 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
19f20 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
19f30 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
19f40 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
19f50 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
19f60 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
19f70 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
19f80 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
19f90 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
19fa0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
19fb0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
19fc0 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
19fd0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
19fe0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
19ff0 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
1a000 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1a010 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
1a020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1a030 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1a040 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1a050 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1a060 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1a070 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1a080 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1a090 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1a0a0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1a0b0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1a0c0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1a0d0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1a0e0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1a0f0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1a100 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1a110 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1a120 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1a130 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1a140 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  if..#if SQLITE_M
1a150 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1a160 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
1a170 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65   much of this re
1a180 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  ad request as po
1a190 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
1a1a0 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
1a1b0 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
1a1c0 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
1a1d0 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
1a1e0 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
1a1f0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1a200 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
1a210 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1a220 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
1a230 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1a240 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1a250 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d  on))[offset], am
1a260 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1a270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1a290 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e   nCopy = pFile->
1a2a0 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
1a2b0 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  t;.      memcpy(
1a2c0 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
1a2d0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1a2e0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
1a2f0 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
1a300 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
1a310 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
1a320 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
1a330 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
1a340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1a350 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b  if..  got = seek
1a360 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f  AndRead(pFile, o
1a370 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1a380 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d  );.  if( got==am
1a390 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1a3a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
1a3b0 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  se if( got<0 ){.
1a3c0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1a3d0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
1a3e0 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ead */.    retur
1a3f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
1a400 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1a410 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1a420 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a  (pFile, 0);   /*
1a430 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
1a440 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e  ror */.    /* Un
1a450 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
1a460 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
1a470 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
1a480 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
1a490 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
1a4a0 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
1a4b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1a4c0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
1a4d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
1a4e0 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68  tempt to seek th
1a4f0 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  e file-descripto
1a500 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
1a510 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
1a520 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66  o.** absolute of
1a530 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20  fset iOff, then 
1a540 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
1a550 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64   nBuf bytes of d
1a560 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66  ata from.** pBuf
1a570 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72   to it. If an er
1a580 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
1a590 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70  rn -1 and set *p
1a5a0 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73  iErrno. Otherwis
1a5b0 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  e, .** return th
1a5c0 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20  e actual number 
1a5d0 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1a5e0 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c   (which may be l
1a5f0 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66  ess than.** nBuf
1a600 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1a610 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
1a620 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20  .  int fd,      
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1a650 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74  iptor to write t
1a660 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c  o */.  i64 iOff,
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f         /* File o
1a690 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77  ffset to begin w
1a6a0 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63  riting at */.  c
1a6b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a6d0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1a6e0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
1a6f0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
1a700 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20  t nBuf,         
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a720 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
1a730 70 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f  pBuf in bytes */
1a740 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20  .  int *piErrno 
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
1a770 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72   number if error
1a780 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20   occurs */.){.  
1a790 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1a7c0 64 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  d by system call
1a7d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   */..  assert( n
1a7e0 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66  Buf==(nBuf&0x1ff
1a7f0 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
1a800 20 66 64 3e 32 20 29 3b 0a 20 20 61 73 73 65 72   fd>2 );.  asser
1a810 74 28 20 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b  t( piErrno!=0 );
1a820 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66  .  nBuf &= 0x1ff
1a830 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  ff;.  TIMER_STAR
1a840 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  T;..#if defined(
1a850 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
1a860 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72   rc = (int)osPwr
1a870 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42  ite(fd, pBuf, nB
1a880 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c  uf, iOff); }whil
1a890 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1a8a0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66  ==EINTR );.#elif
1a8b0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1a8c0 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d  AD64).  do{ rc =
1a8d0 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 36 34   (int)osPwrite64
1a8e0 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1a8f0 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20 72   iOff);}while( r
1a900 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1a910 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f  NTR);.#else.  do
1a920 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b 20  {.    i64 iSeek 
1a930 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66 66  = lseek(fd, iOff
1a940 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
1a950 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1a960 28 20 69 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a  ( iSeek = -1 );.
1a970 20 20 20 20 69 66 28 20 69 53 65 65 6b 3c 30 20      if( iSeek<0 
1a980 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
1a990 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a9a0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
1a9b0 57 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  Write(fd, pBuf, 
1a9c0 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28  nBuf);.  }while(
1a9d0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a9e0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
1a9f0 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1aa00 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
1aa10 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1aa20 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63   %llu\n", fd, rc
1aa30 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c  , iOff, TIMER_EL
1aa40 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20  APSED));..  if( 
1aa50 72 63 3c 30 20 29 20 2a 70 69 45 72 72 6e 6f 20  rc<0 ) *piErrno 
1aa60 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  = errno;.  retur
1aa70 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1aa80 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
1aa90 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
1aaa0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
1aab0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
1aac0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1aad0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
1aae0 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
1aaf0 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
1ab00 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1ab10 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
1ab20 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
1ab30 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
1ab40 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
1ab50 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
1ab60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
1ab70 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
1ab80 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
1ab90 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
1aba0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1abb0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65  , int cnt){.  re
1abc0 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74  turn seekAndWrit
1abd0 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eFd(id->h, offse
1abe0 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69  t, pBuf, cnt, &i
1abf0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d  d->lastErrno);.}
1ac00 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
1ac10 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
1ac20 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
1ac30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1ac40 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
1ac50 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
1ac60 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
1ac70 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
1ac80 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
1ac90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1aca0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1acb0 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
1acc0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
1acd0 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
1ace0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1acf0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1ad00 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
1ad10 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1ad20 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
1ad30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1ad40 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
1ad50 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
1ad60 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
1ad70 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
1ad80 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
1ad90 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
1ada0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
1adb0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
1adc0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
1add0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1ade0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
1adf0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1ae00 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1ae10 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1ae20 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1ae30 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1ae40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ae50 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
1ae60 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1ae70 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1ae80 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1ae90 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
1aea0 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1aeb0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1aec0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1aed0 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1aee0 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
1aef0 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
1af00 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
1af10 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
1af20 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
1af30 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
1af40 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1af50 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
1af60 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
1af70 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
1af80 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1af90 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
1afa0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
1afb0 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
1afc0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1afd0 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
1afe0 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
1aff0 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
1b000 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1b010 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
1b020 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
1b030 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b040 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
1b050 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
1b060 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
1b070 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
1b080 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b090 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1b0a0 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
1b0b0 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
1b0c0 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
1b0d0 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
1b0e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
1b0f0 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1b100 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1b110 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
1b120 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
1b130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1b140 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1b150 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45  d(SQLITE_MMAP_RE
1b160 41 44 57 52 49 54 45 29 20 26 26 20 53 51 4c 49  ADWRITE) && SQLI
1b170 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1b180 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
1b190 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
1b1a0 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
1b1b0 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1b1c0 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1b1d0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1b1e0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1b1f0 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1b200 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1b210 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1b220 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1b230 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1b240 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1b250 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1b260 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1b270 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1b280 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  f, amt);.      r
1b290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b2a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b2b0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1b2c0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1b2d0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1b2e0 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1b2f0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1b300 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1b310 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1b320 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1b330 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1b340 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1b350 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1b360 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1b370 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c  .#endif. .  whil
1b380 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  e( (wrote = seek
1b390 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
1b3a0 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
1b3b0 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65  t))<amt && wrote
1b3c0 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
1b3d0 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
1b3e0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
1b3f0 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
1b400 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
1b410 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
1b420 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
1b430 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
1b440 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1b450 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
1b460 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
1b470 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20   amt>wrote ){.  
1b480 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
1b490 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1b4a0 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
1b4b0 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1b4c0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1b4d0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1b4e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b4f0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1b500 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  e{.      storeLa
1b510 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30  stErrno(pFile, 0
1b520 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  ); /* not a syst
1b530 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1b540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b550 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1b560 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b570 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1b580 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1b590 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1b5a0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1b5b0 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1b5c0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1b5d0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1b5e0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1b5f0 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1b600 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1b610 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1b620 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1b630 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1b640 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1b650 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1b660 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1b670 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1b680 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1b690 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1b6a0 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1b6b0 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1b6c0 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1b6d0 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1b6e0 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1b6f0 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1b700 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1b710 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1b720 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1b730 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1b740 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1b750 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1b760 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d  c=fdatasync or -
1b770 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  DHAVE_FDATASYNC.
1b780 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1b790 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 48  fdatasync) && !H
1b7a0 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20  AVE_FDATASYNC.# 
1b7b0 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
1b7c0 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
1b7d0 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
1b7e0 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
1b7f0 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
1b800 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1b810 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
1b820 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
1b830 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
1b840 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
1b850 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
1b860 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
1b870 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
1b880 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
1b890 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
1b8a0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1b8b0 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
1b8c0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1b8d0 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  SYNC 0.#endif...
1b8e0 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
1b8f0 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
1b900 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
1b910 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
1b920 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
1b930 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
1b940 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
1b950 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
1b960 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
1b970 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
1b980 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
1b990 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
1b9a0 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
1b9b0 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
1b9c0 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
1b9d0 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
1b9e0 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
1b9f0 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
1ba00 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
1ba10 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
1ba20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
1ba30 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
1ba40 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
1ba50 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
1ba60 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
1ba70 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
1ba80 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
1ba90 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
1baa0 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
1bab0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1bac0 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74  ** SQLite sets t
1bad0 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1bae0 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   if the size of 
1baf0 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68  the file is unch
1bb00 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64  anged..** The id
1bb10 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e  ea behind dataOn
1bb20 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68  ly is that it sh
1bb30 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20  ould only write 
1bb40 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  the file content
1bb50 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74  .** to disk, not
1bb60 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20   the inode.  We 
1bb70 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c  only set dataOnl
1bb80 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69  y if the file si
1bb90 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e  ze is .** unchan
1bba0 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69  ged since the fi
1bbb0 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20  le size is part 
1bbc0 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48  of the inode.  H
1bbd0 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20  owever, .** Ted 
1bbe0 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68  Ts'o tells us th
1bbf0 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1bc00 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74  ill also write t
1bc10 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a  he inode if the.
1bc20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73  ** file size has
1bc30 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f   changed.  The o
1bc40 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65  nly real differe
1bc50 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74  nce between fdat
1bc60 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66  async().** and f
1bc70 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c  sync(), Ted tell
1bc80 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64  s us, is that fd
1bc90 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e  atasync() will n
1bca0 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20  ot flush the.** 
1bcb0 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69  inode if the mti
1bcc0 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f  me or owner or o
1bcd0 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69  ther inode attri
1bce0 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67  butes have chang
1bcf0 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63  ed..** We only c
1bd00 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69  are about the fi
1bd10 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65  le size, not the
1bd20 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72   other file attr
1bd30 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73  ibutes, so.** as
1bd40 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69   far as SQLite i
1bd50 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20  s concerned, an 
1bd60 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61  fdatasync() is a
1bd70 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a  lways adequate..
1bd80 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73  ** So, we always
1bd90 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29   use fdatasync()
1bda0 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
1bdb0 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ble, regardless 
1bdc0 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  of.** the value 
1bdd0 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  of the dataOnly 
1bde0 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flag..*/.static 
1bdf0 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69  int full_fsync(i
1be00 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53  nt fd, int fullS
1be10 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  ync, int dataOnl
1be20 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  y){.  int rc;.. 
1be30 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1be40 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c  g "ifdef/elif/el
1be50 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74  se/" block has t
1be60 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72  he same structur
1be70 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e  e as.  ** the on
1be80 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72  e below. It is r
1be90 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73  eplicated here s
1bea0 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63  olely to avoid c
1beb0 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20  luttering .  ** 
1bec0 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65  up the real code
1bed0 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44   with the UNUSED
1bee0 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63  _PARAMETER() mac
1bef0 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ros..  */.#ifdef
1bf00 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1bf10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1bf20 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
1bf30 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1bf40 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1bf50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1bf60 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46  y);.#elif HAVE_F
1bf70 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45  ULLFSYNC.  UNUSE
1bf80 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1bf90 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55  Only);.#else.  U
1bfa0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1bfb0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1bfc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1bfd0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a  taOnly);.#endif.
1bfe0 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
1bff0 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
1c000 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
1c010 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
1c020 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
1c030 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
1c040 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
1c050 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1c060 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
1c070 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
1c080 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
1c090 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
1c0a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1c0b0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1c0c0 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
1c0d0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
1c0e0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1c0f0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
1c100 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
1c110 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
1c120 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
1c130 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
1c140 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75 74    ** no-op.  But
1c150 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63 61   go ahead and ca
1c160 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 76 61  ll fstat() to va
1c170 6c 69 64 61 74 65 20 74 68 65 20 66 69 6c 65 0a  lidate the file.
1c180 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
1c190 61 73 20 77 65 20 6e 65 65 64 20 61 20 6d 65 74  as we need a met
1c1a0 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61  hod to provoke a
1c1b0 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67 0a   failure during.
1c1c0 20 20 2a 2a 20 63 6f 76 65 72 61 74 65 20 74 65    ** coverate te
1c1d0 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66 64  sting..  */.#ifd
1c1e0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1c1f0 43 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  C.  {.    struct
1c200 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 72   stat buf;.    r
1c210 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
1c220 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66  &buf);.  }.#elif
1c230 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1c240 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1c250 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  {.    rc = osFcn
1c260 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
1c270 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
1c280 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
1c290 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
1c2a0 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66  LFSYNC failed, f
1c2b0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65  all back to atte
1c2c0 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28  mpting an fsync(
1c2d0 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c  )..  ** It shoul
1c2e0 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65  dn't be possible
1c2f0 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74   for fullfsync t
1c300 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f  o fail on the lo
1c310 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73  cal .  ** file s
1c320 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20  ystem (on OSX), 
1c330 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63  so failure indic
1c340 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53  ates that FULLFS
1c350 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73  YNC.  ** isn't s
1c360 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69  upported for thi
1c370 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53  s file system. S
1c380 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73  o, attempt an fs
1c390 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66  ync .  ** and (f
1c3a0 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74  or now) ignore t
1c3b0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61  he overhead of a
1c3c0 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e   superfluous fcn
1c3d0 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20  tl call.  .  ** 
1c3e0 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74  It'd be better t
1c3f0 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79  o detect fullfsy
1c400 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20  nc support once 
1c410 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20  and avoid .  ** 
1c420 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65  the fcntl call e
1c430 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69  very time sync i
1c440 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20  s called..  */. 
1c450 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
1c460 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66  sync(fd);..#elif
1c470 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1c480 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79  __).  /* fdatasy
1c490 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65  nc() on HFS+ doe
1c4a0 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74  sn't yet flush t
1c4b0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20  he file size if 
1c4c0 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65  it changed corre
1c4d0 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72  ctly.  ** so cur
1c4e0 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c  rently we defaul
1c4f0 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74  t to the macro t
1c500 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64  hat redefines fd
1c510 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63  atasync to fsync
1c520 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79  .  */.  rc = fsy
1c530 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20  nc(fd);.#else . 
1c540 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
1c550 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  fd);.#if OS_VXWO
1c560 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31  RKS.  if( rc==-1
1c570 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53   && errno==ENOTS
1c580 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  UP ){.    rc = f
1c590 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65  sync(fd);.  }.#e
1c5a0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
1c5b0 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  KS */.#endif /* 
1c5c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1c5d0 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46  SYNC elif HAVE_F
1c5e0 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69  ULLFSYNC */..  i
1c5f0 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  f( OS_VXWORKS &&
1c600 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20   rc!= -1 ){.    
1c610 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  rc = 0;.  }.  re
1c620 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c630 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  * Open a file de
1c640 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
1c650 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1c660 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e  ning file zFilen
1c670 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ame..** If succe
1c680 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73  ssful, *pFd is s
1c690 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  et to the opened
1c6a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c6b0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1c6c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
1c6d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c6e0 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
1c6f0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c  _NOMEM.** or SQL
1c700 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20  ITE_CANTOPEN is 
1c710 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46  returned and *pF
1c720 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75  d is set to an u
1c730 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75  ndefined.** valu
1c740 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72  e..**.** The dir
1c750 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
1c760 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66  riptor is used f
1c770 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e  or only one thin
1c780 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28  g - to.** fsync(
1c790 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ) a directory to
1c7a0 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20   make sure file 
1c7b0 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c  creation and del
1c7c0 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20  etion events.** 
1c7d0 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64  are flushed to d
1c7e0 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63  isk.  Such fsync
1c7f0 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
1c800 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75   on newer.** jou
1c810 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74  rnaling filesyst
1c820 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71  ems, but are req
1c830 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66  uired on older f
1c840 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a  ilesystems..**.*
1c850 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1c860 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
1c870 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53   using the xSetS
1c880 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65  ysCall interface
1c890 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79  ..** The ability
1c8a0 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69   to override thi
1c8b0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64  s routine was ad
1c8c0 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f  ded in support o
1c8d0 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75  f the.** chromiu
1c8e0 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e  m sandbox.  Open
1c8f0 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
1c900 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69  is a security ri
1c910 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f  sk (we are.** to
1c920 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74  ld) so making it
1c930 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c   overrideable al
1c940 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75  lows the chromiu
1c950 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20  m sandbox to.** 
1c960 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75  replace this rou
1c970 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d  tine with a harm
1c980 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20  less no-op.  To 
1c990 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  make this routin
1c9a0 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65  e.** a no-op, re
1c9b0 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20  place it with a 
1c9c0 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e  stub that return
1c9d0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  s SQLITE_OK but 
1c9e0 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73  leaves.** *pFd s
1c9f0 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65  et to a negative
1ca00 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   number..**.** I
1ca10 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1ca20 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
1ca30 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1ca40 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a  le for closing.*
1ca50 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
1ca60 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67  iptor *pFd using
1ca70 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61   close()..*/.sta
1ca80 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
1ca90 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
1caa0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74   *zFilename, int
1cab0 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69   *pFd){.  int ii
1cac0 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
1cad0 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65  .  char zDirname
1cae0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
1caf0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1cb00 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
1cb10 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25  ME, zDirname, "%
1cb20 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
1cb30 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74    for(ii=(int)st
1cb40 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
1cb50 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d 65  ii>0 && zDirname
1cb60 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
1cb70 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
1cb80 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
1cb90 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65   = '\0';.  }else
1cba0 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e 61  {.    if( zDirna
1cbb0 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44 69  me[0]!='/' ) zDi
1cbc0 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a  rname[0] = '.';.
1cbd0 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d 20      zDirname[1] 
1cbe0 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20  = 0;.  }.  fd = 
1cbf0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72  robust_open(zDir
1cc00 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
1cc10 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69  _BINARY, 0);.  i
1cc20 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
1cc30 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1cc40 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1cc50 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1cc60 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
1cc70 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65 74   if( fd>=0 ) ret
1cc80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cc90 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1cca0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1ccb0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1ccc0 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69 72  Directory", zDir
1ccd0 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  name);.}../*.** 
1cce0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1ccf0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1cd00 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1cd10 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1cd20 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1cd30 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1cd40 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1cd50 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1cd60 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1cd70 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1cd80 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1cd90 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1cda0 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1cdb0 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1cdc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1cdd0 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1cde0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1cdf0 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1ce00 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1ce10 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1ce20 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1ce30 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1ce40 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1ce50 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1ce60 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1ce70 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1ce80 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1ce90 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1cea0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1ceb0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1cec0 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1ced0 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1cee0 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1cef0 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1cf00 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1cf10 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1cf20 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1cf30 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1cf40 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1cf50 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1cf60 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1cf70 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1cf80 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1cf90 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1cfa0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1cfb0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1cfc0 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1cfd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1cfe0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1cff0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1d000 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1d010 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1d020 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1d030 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1d040 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1d050 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1d060 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1d070 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1d080 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1d090 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1d0a0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1d0b0 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1d0c0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1d0d0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1d0e0 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1d0f0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1d100 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1d110 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1d120 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1d130 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1d140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1d150 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1d160 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1d170 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1d180 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1d190 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1d1a0 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1d1b0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1d1c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1d1d0 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1d1e0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1d1f0 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1d200 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1d210 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1d220 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1d230 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1d240 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1d250 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1d260 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1d270 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1d280 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
1d290 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1d2a0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1d2b0 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66  _IOERR_FSYNC, "f
1d2c0 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c  ull_fsync", pFil
1d2d0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
1d2e0 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20    /* Also fsync 
1d2f0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1d300 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c  ntaining the fil
1d310 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43  e if the DIRSYNC
1d320 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
1d330 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e  t.  This is a on
1d340 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63  e-time occurrenc
1d350 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73  e.  Many systems
1d360 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29   (examples: AIX)
1d370 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65  .  ** are unable
1d380 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65   to fsync a dire
1d390 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65  ctory, so ignore
1d3a0 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66   errors on the f
1d3b0 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sync..  */.  if(
1d3c0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1d3d0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  s & UNIXFILE_DIR
1d3e0 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  SYNC ){.    int 
1d3f0 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41  dirfd;.    OSTRA
1d400 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20  CE(("DIRSYNC %s 
1d410 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
1d420 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
1d430 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
1d440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
1d450 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
1d460 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20  Fullsync));.    
1d470 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
1d480 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74  tory(pFile->zPat
1d490 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
1d4a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d4b0 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f  K ){.      full_
1d4c0 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20  fsync(dirfd, 0, 
1d4d0 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  0);.      robust
1d4e0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69  _close(pFile, di
1d4f0 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
1d500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d510 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1d520 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
1d530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d540 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d550 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1d560 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
1d570 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74  RSYNC;.  }.  ret
1d580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d590 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
1d5a0 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
1d5b0 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
1d5c0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
1d5d0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
1d5e0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
1d5f0 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  e){.  unixFile *
1d600 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1d610 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  e *)id;.  int rc
1d620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
1d630 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
1d640 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1d650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d660 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  CATE );..  /* If
1d670 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
1d680 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
1d690 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
1d6a0 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
1d6b0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
1d6c0 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
1d6d0 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
1d6e0 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
1d6f0 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
1d700 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
1d710 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
1d720 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
1d730 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1d740 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
1d750 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1d760 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1d770 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
1d780 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
1d790 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
1d7a0 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1d7b0 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
1d7c0 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74    rc = robust_ft
1d7d0 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1d7e0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1d7f0 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  rc ){.    storeL
1d800 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1d810 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
1d820 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1d830 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1d840 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1d850 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1d860 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  );.  }else{.#ifd
1d870 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d880 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1d890 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
1d8a0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
1d8b0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
1d8c0 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64  osed to.    ** d
1d8d0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1d8e0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1d8f0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1d900 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1d910 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64  .    ** normal d
1d920 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e  atabase file) an
1d930 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68  d we truncate th
1d940 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1d950 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68  ength,.    ** th
1d960 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75  at effectively u
1d970 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1d980 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  e counter.  This
1d990 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20   might happen.  
1d9a0 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72    ** when restor
1d9b0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75  ing a database u
1d9c0 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
1d9d0 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  API from a zero-
1d9e0 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f  length.    ** so
1d9f0 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  urce..    */.   
1da00 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1da10 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79  rmalWrite && nBy
1da20 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  te==0 ){.      p
1da30 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1da40 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  hng = 1;.    }.#
1da50 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1da60 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1da70 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  0.    /* If the 
1da80 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72  file was just tr
1da90 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a  uncated to a siz
1daa0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
1dab0 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20  he currently.   
1dac0 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f   ** mapped regio
1dad0 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66  n, reduce the ef
1dae0 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20  fective mapping 
1daf0 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51  size as well. SQ
1db00 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Lite will.    **
1db10 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20   use read() and 
1db20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73  write() to acces
1db30 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68  s data beyond th
1db40 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f  is point from no
1db50 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  w on.  .    */. 
1db60 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69     if( nByte<pFi
1db70 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1db80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1db90 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20  pSize = nByte;. 
1dba0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1dbb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1dbc0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
1dbd0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1dbe0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1dbf0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1dc00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1dc10 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
1dc20 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
1dc30 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1dc40 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
1dc50 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
1dc60 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  d );.  rc = osFs
1dc70 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29  tat(((unixFile*)
1dc80 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  id)->h, &buf);. 
1dc90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1dca0 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
1dcb0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
1dcc0 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69  reLastErrno((uni
1dcd0 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f  xFile*)id, errno
1dce0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1dcf0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1dd00 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
1dd10 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
1dd20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
1dd30 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
1dd40 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49  abase, the findI
1dd50 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65  nodeInfo() proce
1dd60 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73  dure.  ** writes
1dd70 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1dd80 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e  nto that file in
1dd90 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
1dda0 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a  round a bug.  **
1ddb0 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64   in the OS-X msd
1ddc0 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  os filesystem.  
1ddd0 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  In order to avoi
1dde0 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  d problems with 
1ddf0 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72  upper.  ** layer
1de00 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  s, we need to re
1de10 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73  port this file s
1de20 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e  ize as zero even
1de30 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
1de40 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54  ** really 1.   T
1de50 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a  icket #3260..  *
1de60 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d  /.  if( *pSize==
1de70 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a  1 ) *pSize = 0;.
1de80 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1de90 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
1dea0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1deb0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1dec0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
1ded0 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72  *.** Handler for
1dee0 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66   proxy-locking f
1def0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62  ile-control verb
1df00 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f  s.  Defined belo
1df10 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78  w in the.** prox
1df20 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76  ying locking div
1df30 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ision..*/.static
1df40 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
1df50 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1df60 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a  le*,int,void*);.
1df70 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54  #endif../* .** T
1df80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1df90 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65  called to handle
1dfa0 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
1dfb0 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20  L_SIZE_HINT .** 
1dfc0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65  file-control ope
1dfd0 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65  ration.  Enlarge
1dfe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
1dff0 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a   nBytes in size.
1e000 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74  ** (rounded up t
1e010 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b  o the next chunk
1e020 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20  -size).  If the 
1e030 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
1e040 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72  ady.** nBytes or
1e050 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f   larger, this ro
1e060 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1e070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e080 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e  fcntlSizeHint(un
1e090 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
1e0a0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  64 nByte){.  if(
1e0b0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
1e0c0 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69  0 ){.    i64 nSi
1e0d0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1e0e0 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
1e0f0 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
1e100 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1e110 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
1e120 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c    /* Used to hol
1e130 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  d return values 
1e140 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20  of fstat() */.  
1e150 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61   .    if( osFsta
1e160 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
1e170 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1e180 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1e190 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  STAT;.    }..   
1e1a0 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1e1b0 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1e1c0 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1e1d0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1e1e0 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1e1f0 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1e200 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1e210 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1e220 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1e230 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1e240 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1e250 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1e260 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1e270 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1e280 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1e290 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1e2a0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1e2b0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1e2c0 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1e2d0 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1e2e0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1e2f0 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1e300 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1e310 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1e320 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1e330 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1e340 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1e350 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1e360 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1e370 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1e380 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1e390 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1e3a0 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1e3b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e3c0 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1e3d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1e3e0 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1e3f0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1e400 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69 74  ), fake it. Writ
1e410 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73 69  e a .      ** si
1e420 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65  ngle byte to the
1e430 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61   last byte in ea
1e440 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66 61  ch block that fa
1e450 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20 20  lls entirely.   
1e460 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65     ** within the
1e470 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
1e480 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75 69  . Then, if requi
1e490 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62 79  red, a single by
1e4a0 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  te.      ** at o
1e4b0 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c  ffset (nSize-1),
1e4c0 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65   to set the size
1e4d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 72   of the file cor
1e4e0 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a  rectly..      **
1e4f0 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69 6c   This is a simil
1e500 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20  ar technique to 
1e510 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c 69  that used by gli
1e520 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20  bc on systems.  
1e530 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e      ** that do n
1e540 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
1e550 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e  allocate() call.
1e560 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e570 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73  int nBlk = buf.s
1e580 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46  t_blksize;  /* F
1e590 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b  ile-system block
1e5a0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69   size */.      i
1e5b0 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20  nt nWrite = 0;  
1e5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e5d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1e5e0 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e 64  itten by seekAnd
1e5f0 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 69  Write */.      i
1e600 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20  64 iWrite;      
1e610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1e620 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69  xt offset to wri
1e630 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20  te to */..      
1e640 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73 74  iWrite = (buf.st
1e650 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b  _size/nBlk)*nBlk
1e660 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20   + nBlk - 1;.   
1e670 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69 74     assert( iWrit
1e680 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  e>=buf.st_size )
1e690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e6a0 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b  ((iWrite+1)%nBlk
1e6b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  )==0 );.      fo
1e6c0 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72  r(/*no-op*/; iWr
1e6d0 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31  ite<nSize+nBlk-1
1e6e0 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29  ; iWrite+=nBlk )
1e6f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 57  {.        if( iW
1e700 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57  rite>=nSize ) iW
1e710 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31  rite = nSize - 1
1e720 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74 65  ;.        nWrite
1e730 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1e740 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22  pFile, iWrite, "
1e750 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 1);.        i
1e760 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72  f( nWrite!=1 ) r
1e770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e780 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20  RR_WRITE;.      
1e790 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1e7a0 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   }..#if SQLITE_M
1e7b0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1e7c0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70   if( pFile->mmap
1e7d0 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42 79  SizeMax>0 && nBy
1e7e0 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  te>pFile->mmapSi
1e7f0 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ze ){.    int rc
1e800 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
1e810 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20  >szChunk<=0 ){. 
1e820 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
1e830 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1e840 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  >h, nByte) ){.  
1e850 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1e860 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1e870 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
1e880 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1e890 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1e8a0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1e8b0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1e8c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e8d0 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d  ..    rc = unixM
1e8e0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  apfile(pFile, nB
1e8f0 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  yte);.    return
1e900 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1e910 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e920 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
1e930 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 61   *pArg is initia
1e940 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
1e950 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
1e960 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
1e970 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
1e980 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
1e990 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
1e9a0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1e9b0 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
1e9c0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
1e9d0 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
1e9e0 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
1e9f0 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
1ea00 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
1ea10 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64  tic void unixMod
1ea20 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  eBit(unixFile *p
1ea30 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  File, unsigned c
1ea40 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70  har mask, int *p
1ea50 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72  Arg){.  if( *pAr
1ea60 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67  g<0 ){.    *pArg
1ea70 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46   = (pFile->ctrlF
1ea80 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b  lags & mask)!=0;
1ea90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70  .  }else if( (*p
1eaa0 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Arg)==0 ){.    p
1eab0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1eac0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73  &= ~mask;.  }els
1ead0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  e{.    pFile->ct
1eae0 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b  rlFlags |= mask;
1eaf0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  .  }.}../* Forwa
1eb00 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
1eb10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1eb20 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
1eb30 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1eb40 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  f);../*.** Infor
1eb50 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
1eb60 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
1eb70 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
1eb80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1eb90 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1eba0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1ebb0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1ebc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1ebd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1ebe0 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  d;.  switch( op 
1ebf0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1ec00 54 45 5f 46 43 4e 54 4c 5f 53 45 52 56 45 52 5f  TE_FCNTL_SERVER_
1ec10 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  MODE: {.      in
1ec20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ec30 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 53 65 72  ;.      int eSer
1ec40 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ver = 0;.      i
1ec50 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
1ec60 61 67 73 20 7c 20 55 4e 49 58 46 49 4c 45 5f 45  ags | UNIXFILE_E
1ec70 58 43 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  XCL ){.        c
1ec80 68 61 72 20 2a 7a 4a 72 6e 6c 20 3d 20 73 71 6c  har *zJrnl = sql
1ec90 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1eca0 2d 6a 6f 75 72 6e 61 6c 22 2c 20 70 46 69 6c 65  -journal", pFile
1ecb0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1ecc0 20 20 69 66 28 20 7a 4a 72 6e 6c 3d 3d 30 20 29    if( zJrnl==0 )
1ecd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ece0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ecf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ed00 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
1ed10 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
1ed20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20  /* Used to hold 
1ed30 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  return values of
1ed40 20 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 20 20   stat() */.     
1ed50 20 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28       if( osStat(
1ed60 7a 4a 72 6e 6c 2c 20 26 62 75 66 29 20 29 7b 0a  zJrnl, &buf) ){.
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1ed80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1ed90 54 41 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  TAT;.          }
1eda0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1edb0 20 20 65 53 65 72 76 65 72 20 3d 20 28 28 62 75    eServer = ((bu
1edc0 66 2e 73 74 5f 6d 6f 64 65 20 26 20 53 5f 49 46  f.st_mode & S_IF
1edd0 44 49 52 29 20 3f 20 31 20 3a 20 30 29 3b 0a 20  DIR) ? 1 : 0);. 
1ede0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1edf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1ee00 69 74 65 33 5f 66 72 65 65 28 7a 4a 72 6e 6c 29  ite3_free(zJrnl)
1ee10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ee20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20  *((int*)pArg) = 
1ee30 65 53 65 72 76 65 72 3b 0a 20 20 20 20 20 20 72  eServer;.      r
1ee40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ee50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ee60 46 43 4e 54 4c 5f 46 49 4c 45 49 44 3a 20 7b 0a  FCNTL_FILEID: {.
1ee70 20 20 20 20 20 20 69 36 34 20 2a 61 49 64 20 3d        i64 *aId =
1ee80 20 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20   (i64*)pArg;.   
1ee90 20 20 20 61 49 64 5b 30 5d 20 3d 20 28 69 36 34     aId[0] = (i64
1eea0 29 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  )(pFile->pInode-
1eeb0 3e 66 69 6c 65 49 64 2e 64 65 76 29 3b 0a 20 20  >fileId.dev);.  
1eec0 20 20 20 20 61 49 64 5b 31 5d 20 3d 20 28 69 36      aId[1] = (i6
1eed0 34 29 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  4)(pFile->pInode
1eee0 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 20  ->fileId.ino);. 
1eef0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ef00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
1ef10 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
1ef20 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  __) && defined(S
1ef30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
1ef40 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29  CH_ATOMIC_WRITE)
1ef50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ef60 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f  _FCNTL_BEGIN_ATO
1ef70 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20  MIC_WRITE: {.   
1ef80 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f     int rc = osIo
1ef90 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32  ctl(pFile->h, F2
1efa0 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f  FS_IOC_START_ATO
1efb0 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20  MIC_WRITE);.    
1efc0 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51    return rc ? SQ
1efd0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e  LITE_IOERR_BEGIN
1efe0 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45  _ATOMIC : SQLITE
1eff0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f000 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f010 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57  _COMMIT_ATOMIC_W
1f020 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RITE: {.      in
1f030 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70  t rc = osIoctl(p
1f040 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f  File->h, F2FS_IO
1f050 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f  C_COMMIT_ATOMIC_
1f060 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65  WRITE);.      re
1f070 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
1f080 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54  _IOERR_COMMIT_AT
1f090 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
1f0a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f0b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f   SQLITE_FCNTL_RO
1f0c0 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52  LLBACK_ATOMIC_WR
1f0d0 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ITE: {.      int
1f0e0 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46   rc = osIoctl(pF
1f0f0 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43  ile->h, F2FS_IOC
1f100 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f  _ABORT_VOLATILE_
1f110 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65  WRITE);.      re
1f120 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
1f130 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f  _IOERR_ROLLBACK_
1f140 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f  ATOMIC : SQLITE_
1f150 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1f160 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26   /* __linux__ &&
1f170 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42   SQLITE_ENABLE_B
1f180 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
1f190 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53  E */..    case S
1f1a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1f1b0 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1f1c0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1f1d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
1f1e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f1f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1f200 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f210 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TL_LAST_ERRNO: {
1f220 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1f230 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  rg = pFile->last
1f240 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
1f250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f260 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f270 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1f280 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1f290 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1f2a0 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1f2b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f2c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f2d0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f2e0 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
1f2f0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1f300 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1f310 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1f320 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a     rc = fcntlSiz
1f330 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69  eHint(pFile, *(i
1f340 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1f350 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f360 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1f370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f380 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f390 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
1f3a0 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e  _WAL: {.      un
1f3b0 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1f3c0 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
1f3d0 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
1f3e0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f3f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f400 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f410 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
1f420 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
1f430 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1f440 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1f450 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
1f460 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f470 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f480 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f490 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
1f4a0 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
1f4b0 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1f4c0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
1f4d0 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
1f4e0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1f4f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f500 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f510 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
1f520 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
1f530 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c  ar *zTFile = sql
1f540 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70  ite3_malloc64( p
1f550 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1f560 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  thname );.      
1f570 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20  if( zTFile ){.  
1f580 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d        unixGetTem
1f590 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
1f5a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
1f5b0 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  TFile);.        
1f5c0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1f5d0 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
1f5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f5f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f600 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f610 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b  NTL_HAS_MOVED: {
1f620 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1f630 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65  rg = fileHasMove
1f640 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  d(pFile);.      
1f650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f660 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
1f670 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1f680 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
1f690 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1f6a0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20  ZE: {.      i64 
1f6b0 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34  newLimit = *(i64
1f6c0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e  *)pArg;.      in
1f6d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
1f6f0 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62  imit>sqlite3Glob
1f700 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
1f710 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
1f720 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  mit = sqlite3Glo
1f730 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1f740 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f750 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1f760 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 65   newLimit may be
1f770 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 74   eventually cast
1f780 20 74 6f 20 28 73 69 7a 65 5f 74 29 20 61 6e 64   to (size_t) and
1f790 20 70 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a   passed.      **
1f7a0 20 74 6f 20 6d 6d 61 70 28 29 2e 20 52 65 73 74   to mmap(). Rest
1f7b0 72 69 63 74 20 69 74 73 20 76 61 6c 75 65 20 74  rict its value t
1f7c0 6f 20 32 47 42 20 69 66 20 28 73 69 7a 65 5f 74  o 2GB if (size_t
1f7d0 29 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73  ) is not at leas
1f7e0 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 36 34 2d  t a.      ** 64-
1f7f0 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  bit type. */.   
1f800 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1f810 30 20 26 26 20 73 69 7a 65 6f 66 28 73 69 7a 65  0 && sizeof(size
1f820 5f 74 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20  _t)<8 ){.       
1f830 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77   newLimit = (new
1f840 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46 46 46  Limit & 0x7FFFFF
1f850 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  FF);.      }..  
1f860 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
1f870 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1f880 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
1f890 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
1f8a0 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
1f8b0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
1f8c0 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
1f8d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1f8e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1f8f0 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
1f900 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
1f910 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1f920 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61          unixUnma
1f930 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20  pfile(pFile);.  
1f940 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
1f950 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  xMapfile(pFile, 
1f960 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
1f970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1f980 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65  urn rc;.    }.#e
1f990 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1f9a0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1f9b0 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20  The pager calls 
1f9c0 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73  this method to s
1f9d0 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61  ignal that it ha
1f9e0 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20  s done.    ** a 
1f9f0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61  rollback and tha
1fa00 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
1fa10 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68  s therefore unch
1fa20 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  anged and.    **
1fa30 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20   it hence it is 
1fa40 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73  OK for the trans
1fa50 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f  action change co
1fa60 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20  unter to be.    
1fa70 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ** unchanged..  
1fa80 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1fa90 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1faa0 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20  CHANGED: {.     
1fab0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1fac0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
1fad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fae0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
1faf0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1fb00 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1fb10 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1fb20 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
1fb30 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1fb40 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
1fb50 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LE:.    case SQL
1fb60 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f  ITE_FCNTL_GET_LO
1fb70 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
1fb80 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
1fb90 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c  yFileControl(id,
1fba0 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  op,pArg);.    }.
1fbb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1fbc0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1fbd0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1fbe0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
1fbf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1fc00 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
1fc10 2f 2a 0a 2a 2a 20 49 66 20 70 46 64 2d 3e 73 65  /*.** If pFd->se
1fc20 63 74 6f 72 53 69 7a 65 20 69 73 20 6e 6f 6e 2d  ctorSize is non-
1fc30 7a 65 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66  zero when this f
1fc40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1fc50 64 2c 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f  d, it is a.** no
1fc60 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
1fc70 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70 46  the values of pF
1fc80 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 61 6e  d->sectorSize an
1fc90 64 20 0a 2a 2a 20 70 46 64 2d 3e 64 65 76 69 63  d .** pFd->devic
1fca0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fcb0 20 61 72 65 20 73 65 74 20 61 63 63 6f 72 64 69   are set accordi
1fcc0 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65 2d 73  ng to the file-s
1fcd0 79 73 74 65 6d 20 0a 2a 2a 20 63 68 61 72 61 63  ystem .** charac
1fce0 74 65 72 69 73 74 69 63 73 2e 20 0a 2a 2a 0a 2a  teristics. .**.*
1fcf0 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  * There are two 
1fd00 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
1fd10 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 6e 65 20 66   function. One f
1fd20 6f 72 20 51 4e 58 20 61 6e 64 20 6f 6e 65 20 66  or QNX and one f
1fd30 6f 72 20 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20  or all.** other 
1fd40 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
1fd50 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 73  def __QNXNTO__.s
1fd60 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65  tatic void setDe
1fd70 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fd80 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ics(unixFile *pF
1fd90 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  d){.  assert( pF
1fda0 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
1fdb0 65 72 69 73 74 69 63 73 3d 3d 30 20 7c 7c 20 70  eristics==0 || p
1fdc0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 21 3d  Fd->sectorSize!=
1fdd0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
1fde0 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 7b  sectorSize==0 ){
1fdf0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c  .#if defined(__l
1fe00 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e  inux__) && defin
1fe10 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1fe20 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
1fe30 49 54 45 29 0a 20 20 20 20 69 6e 74 20 72 65 73  ITE).    int res
1fe40 3b 0a 20 20 20 20 75 33 32 20 66 20 3d 20 30 3b  ;.    u32 f = 0;
1fe50 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
1fe60 6f 72 20 73 75 70 70 6f 72 74 20 66 6f 72 20 46  or support for F
1fe70 32 46 53 20 61 74 6f 6d 69 63 20 62 61 74 63 68  2FS atomic batch
1fe80 20 77 72 69 74 65 73 2e 20 2a 2f 0a 20 20 20 20   writes. */.    
1fe90 72 65 73 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46  res = osIoctl(pF
1fea0 64 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 47  d->h, F2FS_IOC_G
1feb0 45 54 5f 46 45 41 54 55 52 45 53 2c 20 26 66 29  ET_FEATURES, &f)
1fec0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ;.    if( res==0
1fed0 20 26 26 20 28 66 20 26 20 46 32 46 53 5f 46 45   && (f & F2FS_FE
1fee0 41 54 55 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49  ATURE_ATOMIC_WRI
1fef0 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 46 64  TE) ){.      pFd
1ff00 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1ff10 72 69 73 74 69 63 73 20 3d 20 53 51 4c 49 54 45  ristics = SQLITE
1ff20 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f  _IOCAP_BATCH_ATO
1ff30 4d 49 43 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  MIC;.    }.#endi
1ff40 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26  f /* __linux__ &
1ff50 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1ff60 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
1ff70 54 45 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  TE */..    /* Se
1ff80 74 20 74 68 65 20 50 4f 57 45 52 53 41 46 45 5f  t the POWERSAFE_
1ff90 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 20 69  OVERWRITE flag i
1ffa0 66 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  f requested. */.
1ffb0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 63 74 72      if( pFd->ctr
1ffc0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
1ffd0 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 20 20  E_PSOW ){.      
1ffe0 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61  pFd->deviceChara
1fff0 63 74 65 72 69 73 74 69 63 73 20 7c 3d 20 53 51  cteristics |= SQ
20000 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
20010 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a  SAFE_OVERWRITE;.
20020 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 64 2d 3e      }..    pFd->
20030 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
20040 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
20050 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23  OR_SIZE;.  }.}.#
20060 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73  else.#include <s
20070 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23  ys/dcmd_blk.h>.#
20080 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
20090 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 76  tvfs.h>.static v
200a0 6f 69 64 20 73 65 74 44 65 76 69 63 65 43 68 61  oid setDeviceCha
200b0 72 61 63 74 65 72 69 73 74 69 63 73 28 75 6e 69  racteristics(uni
200c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
200d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74   if( pFile->sect
200e0 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20  orSize == 0 ){. 
200f0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66     struct statvf
20100 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
20110 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66   .    /* Set def
20120 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75  aults for non-su
20130 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74  pported filesyst
20140 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ems */.    pFile
20150 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53  ->sectorSize = S
20160 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
20170 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70  CTOR_SIZE;.    p
20180 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
20190 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
201a0 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66  .    if( fstatvf
201b0 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49  s(pFile->h, &fsI
201c0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20  nfo) == -1 ) {. 
201d0 20 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c       return pFil
201e0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  e->sectorSize;. 
201f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73     }..    if( !s
20200 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
20210 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20  asetype, "tmp") 
20220 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
20230 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
20240 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
20250 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
20260 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20270 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
20280 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b  E_IOCAP_ATOMIC4K
20290 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20   |       /* All 
202a0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77  ram filesystem w
202b0 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
202c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
202d0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
202e0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
202f0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
20300 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
20310 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
20340 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
20350 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
20360 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
20370 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
20380 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
20390 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
203a0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
203d0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
203e0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
203f0 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
20400 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
20410 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20  , "etfs") ){.   
20420 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
20430 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
20440 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
20450 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
20460 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
20470 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73      /* etfs clus
20480 74 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20  ter size writes 
20490 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
204a0 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65        (pFile->se
204b0 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
204c0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
204d0 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20  OMIC512) |.     
204e0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
204f0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
20500 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
20510 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
20520 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
20560 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
20570 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
20580 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
20590 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
205a0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
205b0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
205e0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
205f0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
20600 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
20610 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
20620 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22  basetype, "qnx6"
20630 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
20640 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
20650 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
20660 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
20670 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20680 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
20690 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20  TE_IOCAP_ATOMIC 
206a0 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  |         /* All
206b0 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74   filesystem writ
206c0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
206d0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
206e0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
206f0 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
20700 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
20710 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20740 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
20750 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
20760 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20770 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
20780 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
20790 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
207a0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207d0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
207e0 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
207f0 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
20800 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
20810 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
20820 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20  "qnx4") ){.     
20830 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
20840 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
20850 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
20860 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
20870 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
20880 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
20890 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
208a0 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
208b0 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
208c0 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
208d0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
208e0 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
208f0 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
20900 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
20910 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
20920 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
20930 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
20940 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
20950 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20980 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
20990 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
209a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
209b0 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
209c0 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29  setype, "dos") )
209d0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
209e0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
209f0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
20a00 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20a10 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20a20 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
20a30 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
20a40 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
20a50 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
20a60 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
20a70 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
20a80 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
20a90 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
20aa0 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
20ab0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20ac0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
20ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
20ae0 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
20af0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
20b30 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
20b40 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
20b50 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  {.      pFile->d
20b60 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20b70 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
20b80 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20b90 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20  IC512 |      /* 
20ba0 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69  blocks are atomi
20bb0 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
20bc0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
20bd0 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
20be0 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
20bf0 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
20c00 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
20c30 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
20c40 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
20c50 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73    }.  }.  /* Las
20c60 74 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63  t chance verific
20c70 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ation.  If the s
20c80 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74  ector size isn't
20c90 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35   a multiple of 5
20ca0 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  12.  ** then it 
20cb0 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20  isn't valid.*/. 
20cc0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74   if( pFile->sect
20cd0 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20  orSize % 512 != 
20ce0 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
20cf0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20d00 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70  stics = 0;.    p
20d10 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20d20 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
20d30 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
20d40 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
20d50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
20d60 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
20d70 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
20d80 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
20d90 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
20da0 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
20db0 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
20dc0 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
20dd0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
20de0 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
20df0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
20e00 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
20e10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
20e20 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
20e30 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
20e40 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
20e50 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
20e60 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
20e70 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
20e80 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
20e90 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
20ea0 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
20eb0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
20ec0 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
20ed0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
20ee0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
20ef0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
20f00 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
20f10 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
20f20 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 74  xFile*)id;.  set
20f30 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
20f40 73 74 69 63 73 28 70 46 64 29 3b 0a 20 20 72 65  stics(pFd);.  re
20f50 74 75 72 6e 20 70 46 64 2d 3e 73 65 63 74 6f 72  turn pFd->sector
20f60 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Size;.}../*.** R
20f70 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
20f80 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
20f90 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a   for the file..*
20fa0 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73  *.** This VFS is
20fb0 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72   set up to retur
20fc0 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  n SQLITE_IOCAP_P
20fd0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20fe0 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a  TE by default..*
20ff0 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
21000 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 6f  choice is contro
21010 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65  versial since te
21020 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e  chnically the un
21030 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65  derlying.** file
21040 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
21050 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20   always provide 
21060 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72  powersafe overwr
21070 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72  ites.  (In other
21080 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72  .** words, after
21090 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76   a power-loss ev
210a0 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68  ent, parts of th
210b0 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65  e file that were
210c0 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65   never.** writte
210d0 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  n might end up b
210e0 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20  eing altered.)  
210f0 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f  However, non-PSO
21100 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65  W behavior is ve
21110 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65  ry,.** very rare
21120 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67  .  And asserting
21130 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61   PSOW makes a la
21140 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e  rge reduction in
21150 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f   the amount.** o
21160 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66  f required I/O f
21170 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73  or journaling, s
21180 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61  ince a lot of pa
21190 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61  dding is elimina
211a0 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20  ted..**  Hence, 
211b0 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f  while POWERSAFE_
211c0 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20  OVERWRITE is on 
211d0 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  by default, ther
211e0 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74  e is a file-cont
211f0 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  rol.** available
21200 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20   to turn it off 
21210 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61  and URI query pa
21220 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c  rameter availabl
21230 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
21240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21250 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
21260 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
21270 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
21280 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
21290 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
212a0 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74  setDeviceCharact
212b0 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20  eristics(pFd);. 
212c0 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 64 65 76   return pFd->dev
212d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
212e0 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  cs;.}..#if !defi
212f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21300 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
21310 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a  AX_MMAP_SIZE>0..
21320 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21330 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   system page siz
21340 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
21350 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
21360 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65  t be called dire
21370 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63 6f  ctly by other co
21380 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  de in this file.
21390 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74   .** Instead, it
213a0 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
213b0 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47 65  d via macro osGe
213c0 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a  tpagesize()..*/.
213d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
213e0 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29  etpagesize(void)
213f0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
21400 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b 0a  .  return 1024;.
21410 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 42  #elif defined(_B
21420 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74  SD_SOURCE).  ret
21430 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28  urn getpagesize(
21440 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
21450 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f  n (int)sysconf(_
21460 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65  SC_PAGESIZE);.#e
21470 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  ndif.}..#endif /
21480 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
21490 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
214a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
214b0 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64 65  IZE>0 */..#ifnde
214c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
214d0 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  L../*.** Object 
214e0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
214f0 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
21500 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
21510 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
21520 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
21530 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
21540 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
21550 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
21560 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
21570 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
21580 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
21590 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
215a0 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
215b0 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
215c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
215d0 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
215e0 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
215f0 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
21600 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
21610 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
21620 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
21630 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
21640 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
21650 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
21660 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
21670 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
21680 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
21690 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
216a0 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
216b0 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
216c0 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
216d0 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
216e0 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
216f0 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
21700 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
21710 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
21720 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
21730 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
21740 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
21750 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
21760 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
21770 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
21780 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
21790 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
217a0 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
217b0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
217c0 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
217d0 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
217e0 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
217f0 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
21800 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
21810 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
21820 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
21830 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
21840 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
21850 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
21860 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
21870 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
21880 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
21890 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
218a0 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
218b0 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
218c0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
218d0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
218e0 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
218f0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
21900 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
21910 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
21920 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
21930 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
21940 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
21950 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
21960 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
21970 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
21980 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
21990 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
219a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
219b0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
219c0 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
219d0 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
219e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
219f0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
21a00 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
21a10 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
21a20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
21a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21a40 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
21a50 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
21a60 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
21a70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
21a80 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
21a90 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
21aa0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
21ab0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
21ac0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
21ad0 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
21ae0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
21af0 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
21b00 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nly */.  char **
21b10 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
21b20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
21b30 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
21b40 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
21b50 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b70 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
21b80 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
21b90 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
21ba0 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
21bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
21bc0 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
21bd0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
21be0 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
21bf0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
21c00 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
21c10 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21c20 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
21c30 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
21c40 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
21c50 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21c60 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
21c70 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
21c80 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
21c90 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
21ca0 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
21cb0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
21cc0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
21cd0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
21ce0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
21cf0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
21d00 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
21d10 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
21d20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
21d30 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
21d40 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
21d50 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
21d60 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
21d70 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
21d80 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
21d90 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
21da0 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
21db0 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
21dc0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
21dd0 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
21de0 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
21df0 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
21e00 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
21e10 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
21e20 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
21e30 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
21e40 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
21e50 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
21e60 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
21e70 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
21e80 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
21e90 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
21ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21eb0 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
21ec0 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
21ed0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
21ee0 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
21ef0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21f00 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
21f10 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
21f20 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f40 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
21f50 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
21f60 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
21f70 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
21f80 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
21f90 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
21fa0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
21fb0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
21fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21fd0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
21fe0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
21ff0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
22000 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
22010 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
22020 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
22030 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
22040 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
22050 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
22060 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
22070 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
22080 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
22090 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
220a0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
220b0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
220c0 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
220d0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
220e0 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
220f0 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
22100 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
22110 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
22120 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
22130 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
22140 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
22150 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
22160 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
22170 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46  temLock(.  unixF
22180 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
22190 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63    /* Open connec
221a0 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20  tion to the WAL 
221b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  file */.  int lo
221c0 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
221d0 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52   /* F_UNLCK, F_R
221e0 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b  DLCK, or F_WRLCK
221f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22210 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
22220 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
22230 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20  */.  int n      
22240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22250 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
22260 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  o lock */.){.  u
22270 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
22280 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c  Node; /* Apply l
22290 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
222a0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
222b0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72  segment */.  str
222c0 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
222d0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
222e0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
222f0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
22300 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22310 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c  _OK;    /* Resul
22320 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74  t code form fcnt
22330 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  l() */..  /* Acc
22340 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
22350 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
22360 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
22370 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70  he caller */.  p
22380 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  ShmNode = pFile-
22390 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
223a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
223b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
223c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
223d0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
223e0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
223f0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
22400 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
22410 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
22420 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
22430 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
22440 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
22450 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
22460 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
22470 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f  =1 && n<=SQLITE_
22480 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
22490 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
224a0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  =0 ){.    /* Ini
224b0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
224c0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
224d0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c  /.    memset(&f,
224e0 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a   0, sizeof(f));.
224f0 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c      f.l_type = l
22500 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c  ockType;.    f.l
22510 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
22520 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72  ET;.    f.l_star
22530 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e  t = ofst;.    f.
22540 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20  l_len = n;..    
22550 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68  rc = osFcntl(pSh
22560 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  mNode->h, F_SETL
22570 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d  K, &f);.    rc =
22580 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51   (rc!=(-1)) ? SQ
22590 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
225a0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BUSY;.  }..  /*
225b0 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62   Update the glob
225c0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e  al lock state an
225d0 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69  d do debug traci
225e0 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
225f0 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31  ITE_DEBUG.  { u1
22600 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43  6 mask;.  OSTRAC
22610 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29  E(("SHM-LOCK "))
22620 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e  ;.  mask = ofst>
22630 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31  31 ? 0xffff : (1
22640 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
22650 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
22660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22670 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
22680 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
22690 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
226a0 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
226b0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
226c0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
226d0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
226e0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
226f0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
22700 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
22710 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
22720 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
22730 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
22740 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
22750 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22760 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
22770 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
22780 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
22790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
227a0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
227b0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
227c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
227d0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
227e0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
227f0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22800 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
22810 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
22820 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
22830 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
22840 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
22850 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
22860 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
22870 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
22880 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
22890 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
228a0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
228b0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
228c0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
228d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
228e0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
228f0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
22900 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
22910 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
22920 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
22930 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
22940 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
22950 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
22960 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
22970 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
22980 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22990 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
229a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
229b0 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52       .}../*.** R
229c0 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75  eturn the minimu
229d0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42  m number of 32KB
229e0 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61   shm regions tha
229f0 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70  t should be mapp
22a00 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c  ed at.** a time,
22a10 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65   assuming that e
22a20 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
22a30 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d   be an integer m
22a40 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a  ultiple of the.*
22a50 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d  * current system
22a60 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a   page-size..**.*
22a70 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  * Usually, this 
22a80 69 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74  is 1. The except
22a90 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20  ion seems to be 
22aa0 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65  systems that are
22ab0 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74   configured.** t
22ac0 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73  o use 64KB pages
22ad0 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20   - in this case 
22ae0 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73  each mapping mus
22af0 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74  t cover at least
22b00 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69   two.** shm regi
22b10 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
22b20 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e  nt unixShmRegion
22b30 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20  PerMap(void){.  
22b40 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31  int shmsz = 32*1
22b50 30 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20  024;            
22b60 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69  /* SHM region si
22b70 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  ze */.  int pgsz
22b80 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65   = osGetpagesize
22b90 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20  ();   /* System 
22ba0 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61  page size */.  a
22bb0 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29  ssert( ((pgsz-1)
22bc0 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f  &pgsz)==0 );   /
22bd0 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74  * Page size must
22be0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
22bf0 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73   */.  if( pgsz<s
22c00 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b  hmsz ) return 1;
22c10 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73  .  return pgsz/s
22c20 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  hmsz;.}../*.** P
22c30 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d  urge the unixShm
22c40 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
22c50 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
22c60 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  h unixShmNode.nR
22c70 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
22c80 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
22c90 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
22ca0 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
22cb0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
22cc0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
22cd0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
22ce0 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
22cf0 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67  void unixShmPurg
22d00 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
22d10 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
22d20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65  *p = pFd->pInode
22d30 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
22d40 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
22d50 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
22d60 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 52   && ALWAYS(p->nR
22d70 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e  ef==0) ){.    in
22d80 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
22d90 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
22da0 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b  ap();.    int i;
22db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
22dc0 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e  pInode==pFd->pIn
22dd0 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ode );.    sqlit
22de0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
22df0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
22e00 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
22e10 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61  on; i+=nShmPerMa
22e20 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p){.      if( p-
22e30 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >h>=0 ){.       
22e40 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52   osMunmap(p->apR
22e50 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52  egion[i], p->szR
22e60 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65  egion);.      }e
22e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22e80 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
22e90 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  egion[i]);.     
22ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
22eb0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52  ite3_free(p->apR
22ec0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  egion);.    if( 
22ed0 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  p->h>=0 ){.     
22ee0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
22ef0 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  d, p->h, __LINE_
22f00 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d  _);.      p->h =
22f10 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
22f20 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
22f30 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  de = 0;.    sqli
22f40 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
22f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
22f60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
22f70 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
22f80 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73  ith open databas
22f90 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a  e file pDbFd.  .
22fa0 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  ** This particul
22fb0 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
22fc0 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66  n uses mmapped f
22fd0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
22fe0 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70  file used to imp
22ff0 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65  lement shared-me
23000 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73  mory is in the s
23010 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ame directory.**
23020 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
23030 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68  abase file and h
23040 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
23050 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
23060 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69  abase.** file wi
23070 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75  th the "-shm" su
23080 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72  ffix added.  For
23090 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
230a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
230b0 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72  * is "/home/user
230c0 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65  1/config.db" the
230d0 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  n the file that 
230e0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d  is created and m
230f0 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68  mapped.** for sh
23100 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
23110 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d   be called "/hom
23120 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
23130 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  b-shm".  .**.** 
23140 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68  Another approach
23150 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69   to is to use fi
23160 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20  les in /dev/shm 
23170 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61  or /dev/tmp or a
23180 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20  n.** some other 
23190 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74  tmpfs mount. But
231a0 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20   if a file in a 
231b0 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74  different direct
231c0 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ory.** from the 
231d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
231e0 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66   used, then diff
231f0 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72  ering access per
23200 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61  missions.** or a
23210 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20   chroot() might 
23220 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72  cause two differ
23230 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e  ent processes on
23240 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74   the same.** dat
23250 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20  abase to end up 
23260 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20  using different 
23270 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64  files for shared
23280 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65   memory - .** me
23290 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72  aning that their
232a0 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f   memory would no
232b0 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72  t really be shar
232c0 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a  ed - resulting.*
232d0 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  * in database co
232e0 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72  rruption.  Never
232f0 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d  theless, this tm
23300 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a  pfs file usage.*
23310 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64  * can be enabled
23320 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
23330 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
23340 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f  SHM_DIRECTORY="/
23350 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74  dev/shm".** or t
23360 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  he equivalent.  
23370 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53  The use of the S
23380 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23390 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
233a0 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c  .** option resul
233b0 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  ts in an incompa
233c0 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  tible build of S
233d0 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f  QLite;  builds o
233e0 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74  f SQLite.** that
233f0 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20   with differing 
23400 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
23410 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74  TORY settings at
23420 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65  tempt to use the
23430 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73  .** same databas
23440 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
23450 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73  me time, databas
23460 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
23470 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
23480 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53  lt. The SQLITE_S
23490 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
234a0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
234b0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a   is considered.*
234c0 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20  * "unsupported" 
234d0 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20  and may go away 
234e0 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69  in a future SQLi
234f0 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a  te release..**.*
23500 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
23510 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
23520 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
23530 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
23540 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
23550 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
23560 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
23570 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
23580 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
23590 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
235a0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
235b0 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
235c0 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
235d0 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leared..**.** If
235e0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
235f0 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62  tabase file (pDb
23600 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65  Fd) is using the
23610 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53   "unix-excl" VFS
23620 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74  .** that means t
23630 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  hat an exclusive
23640 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
23650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23660 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e  le and.** that n
23670 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
23680 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65  s are able to re
23690 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
236a0 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a  database.  In.**
236b0 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64   that case, we d
236c0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65  o not really nee
236d0 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  d shared memory.
236e0 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f    No shared memo
236f0 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72  ry.** file is cr
23700 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72  eated.  The shar
23710 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
23720 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68  e simulated with
23730 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   heap memory..*/
23740 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
23750 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
23760 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64  (unixFile *pDbFd
23770 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
23780 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
23790 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
237a0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
237b0 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
237c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
237d0 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20  mNode;   /* The 
237e0 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
237f0 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
23800 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23820 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
23830 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
23840 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
23850 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66   /* The inode of
23860 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
23870 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
23880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
23890 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
238a0 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
238b0 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238d0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
238e0 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
238f0 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
23900 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
23910 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
23920 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
23930 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
23940 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  4( sizeof(*p) );
23950 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
23960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23970 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74  M_BKPT;.  memset
23980 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
23990 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ));.  assert( pD
239a0 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  bFd->pShm==0 );.
239b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
239c0 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e  ee if a unixShmN
239d0 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61  ode object alrea
239e0 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65  dy exists. Reuse
239f0 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
23a00 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74  * one if present
23a10 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f  . Create a new o
23a20 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
23a30 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
23a40 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
23a50 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
23a60 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
23a70 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
23a80 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
23a90 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
23aa0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ac0 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
23ad0 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
23ae0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
23af0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
23b00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
23b10 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62  *zBasePath = pDb
23b20 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69  Fd->zPath;.#endi
23b30 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  f..    /* Call f
23b40 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
23b50 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
23b60 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
23b70 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
23b80 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
23b90 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
23ba0 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
23bb0 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
23bc0 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
23bd0 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
23be0 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  issions..    */.
23bf0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
23c00 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
23c10 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
23c20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
23c30 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
23c40 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23c50 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
23c60 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
23c70 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
23c80 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
23c90 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
23ca0 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
23cb0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
23cc0 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   + (int)strlen(z
23cd0 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69  BasePath);.#endi
23ce0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
23cf0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
23d00 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  4( sizeof(*pShmN
23d10 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
23d20 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
23d30 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
23d40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23d50 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
23d60 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
23d70 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
23d80 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
23d90 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
23da0 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
23db0 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65  e);.    zShmFile
23dc0 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  name = pShmNode-
23dd0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
23de0 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d  ar*)&pShmNode[1]
23df0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
23e00 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
23e10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23e20 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
23e30 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a   zShmFilename, .
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e50 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
23e60 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
23e70 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
23ea0 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
23eb0 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
23ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23ed0 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
23ee0 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
23ef0 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73  , "%s-shm", zBas
23f00 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
23f10 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
23f20 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68  DbFd->zPath, zSh
23f30 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  mFilename);.#end
23f40 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
23f50 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
23f60 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
23f70 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
23f80 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
23f90 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
23fa0 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 73  Inode;.    if( s
23fb0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23fc0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
23fd0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
23fe0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
23ff0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
24000 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
24010 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
24020 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
24030 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24040 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
24050 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
24060 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
24070 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
24080 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
24090 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
240a0 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67      int openFlag
240b0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
240c0 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20  REAT;.      if( 
240d0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
240e0 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
240f0 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
24100 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
24110 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
24120 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
24130 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
24140 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
24150 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
24160 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
24170 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
24180 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
24190 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
241a0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
241b0 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
241c0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
241d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
241e0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
241f0 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
24200 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
24210 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
24220 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
24230 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
24240 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
24250 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
24260 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
24270 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
24280 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
24290 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
242a0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
242b0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
242c0 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
242d0 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
242e0 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
242f0 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
24300 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68  .      robustFch
24310 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  own(pShmNode->h,
24320 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73   sStat.st_uid, s
24330 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20  Stat.st_gid);.  
24340 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
24350 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
24360 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
24370 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
24380 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20  n switch..      
24390 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63  ** If not, trunc
243a0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
243b0 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20  zero length. .  
243c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
243d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
243e0 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79     if( unixShmSy
243f0 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
24400 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
24410 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
24420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24430 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
24440 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
24450 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
24460 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
24470 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
24480 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e  _SHMOPEN, "ftrun
24490 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e  cate", zShmFilen
244a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
244b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
244c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
244d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
244e0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
244f0 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b  k(pDbFd, F_RDLCK
24500 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
24510 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
24520 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
24530 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
24540 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
24550 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
24560 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
24570 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
24580 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
24590 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
245a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
245b0 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
245c0 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
245d0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
245e0 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
245f0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
24600 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
24610 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
24620 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
24630 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
24640 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
24650 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
24660 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
24670 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
24680 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
24690 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
246a0 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
246b0 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62  ruct unixShm) ob
246c0 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
246d0 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
246e0 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
246f0 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
24700 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
24710 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
24720 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
24730 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
24740 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
24750 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
24760 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
24770 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
24780 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78  utex .  ** mutex
24790 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
247a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
247b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
247c0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
247d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
247e0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
247f0 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
24800 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
24810 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
24820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24830 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
24840 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
24850 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
24860 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
24870 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20  DbFd);       /* 
24880 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
24890 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
248a0 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
248b0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69  3_free(p);.  uni
248c0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
248d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
248e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
248f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
24900 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
24910 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
24920 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
24930 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
24940 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
24950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
24960 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
24970 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
24980 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
24990 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
249a0 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
249b0 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
249c0 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
249d0 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
249e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
249f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
24a00 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
24a10 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
24a20 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
24a30 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e  e, if the bExten
24a40 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
24a50 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
24a60 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
24a70 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
24a80 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
24a90 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
24aa0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
24ab0 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
24ac0 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
24ad0 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
24ae0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
24af0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24b00 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e  d. If .** bExten
24b10 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  d is non-zero an
24b20 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
24b30 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
24b40 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
24b50 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
24b60 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
24b70 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
24b80 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
24b90 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
24ba0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
24bb0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
24bc0 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
24bd0 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
24be0 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
24bf0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
24c00 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
24c10 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
24c20 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
24c30 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
24c40 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
24c50 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
24c60 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
24c70 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
24c80 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
24c90 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
24ca0 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
24cb0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
24cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
24cd0 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
24ce0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
24cf0 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d10 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
24d20 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
24d30 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
24d40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
24d50 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
24d60 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20   int bExtend,   
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
24d90 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
24da0 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
24db0 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
24dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
24dd0 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
24de0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
24df0 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
24e00 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53  ile*)fd;.  unixS
24e10 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d  hm *p;.  unixShm
24e20 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
24e30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24e40 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d  E_OK;.  int nShm
24e50 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d  PerMap = unixShm
24e60 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a  RegionPerMap();.
24e70 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e    int nReqRegion
24e80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
24e90 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
24ea0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
24eb0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
24ec0 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28  it now. */.  if(
24ed0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
24ee0 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
24ef0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
24f00 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
24f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24f30 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
24f40 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  hm;.  pShmNode =
24f50 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20   p->pShmNode;.  
24f60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
24f70 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
24f80 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
24f90 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
24fa0 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
24fb0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
24fc0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
24fd0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
24fe0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
24ff0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25000 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
25010 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25020 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
25030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
25040 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
25050 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
25060 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
25070 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75  .  /* Minimum nu
25080 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20  mber of regions 
25090 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d  required to be m
250a0 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71  apped. */.  nReq
250b0 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69  Region = ((iRegi
250c0 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f  on+nShmPerMap) /
250d0 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e   nShmPerMap) * n
250e0 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66  ShmPerMap;..  if
250f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
25100 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
25110 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e  {.    char **apN
25120 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
25130 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
25140 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79  apRegion[] array
25150 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
25160 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  e = nReqRegion*s
25170 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69  zRegion;   /* Mi
25180 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
25190 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
251a0 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
251b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
251c0 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73     /* Used by fs
251d0 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53  tat() */..    pS
251e0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
251f0 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
25200 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
25210 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  h>=0 ){.      /*
25220 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
25230 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
25240 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
25250 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
25260 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20  space..      ** 
25270 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
25280 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
25290 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
252a0 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
252b0 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61  e is.      ** la
252c0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
252d0 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
252e0 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
252f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
25300 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65  osFstat(pShmNode
25310 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
25320 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25330 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
25340 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  E;.        goto 
25350 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
25360 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
25370 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c  ( sStat.st_size<
25380 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
25390 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
253a0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
253b0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
253c0 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65  If bExtend is se
253d0 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
253e0 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c  false, exit earl
253f0 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
25400 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
25410 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25420 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
25430 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65        if( !bExte
25440 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
25450 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
25460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
25470 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
25480 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e  ively, if bExten
25490 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e  d is true, exten
254a0 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74  d the file. Do t
254b0 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a  his by.        *
254c0 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  * writing a sing
254d0 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65  le byte to the e
254e0 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20  nd of each (OS) 
254f0 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20  page being.     
25500 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
25510 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63  or extended. Tec
25520 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65  hnically, we nee
25530 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20  d only write to 
25540 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  the.        ** l
25550 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65  ast page in orde
25560 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  r to extend the 
25570 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e  file. But writin
25580 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20  g to all new.   
25590 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f       ** pages fo
255a0 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61  rces the OS to a
255b0 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d  llocate them imm
255c0 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20  ediately, which 
255d0 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20  reduces.        
255e0 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f  ** the chances o
255f0 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61  f SIGBUS while a
25600 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70  ccessing the map
25610 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72  ped region later
25620 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a   on..        */.
25630 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20          else{.  
25640 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
25650 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
25660 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20  4096;.          
25670 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20  int iPg;..      
25680 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
25690 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
256a0 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f   each newly allo
256b0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
256c0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
256d0 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79      assert( (nBy
256e0 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b  te % pgsz)==0 );
256f0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
25700 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a  Pg=(sStat.st_siz
25710 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42  e/pgsz); iPg<(nB
25720 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b  yte/pgsz); iPg++
25730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
25740 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
25750 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e        if( seekAn
25760 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64  dWriteFd(pShmNod
25770 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b  e->h, iPg*pgsz +
25780 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20   pgsz-1, "", 1, 
25790 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  &x)!=1 ){.      
257a0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
257b0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d  ar *zFile = pShm
257c0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  Node->zFilename;
257d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
257e0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
257f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
25800 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20  MSIZE, "write", 
25810 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
25820 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
25830 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
25840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25850 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
25860 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
25870 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
25880 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
25890 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
258a0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
258b0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
258c0 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c  w = (char **)sql
258d0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
258e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
258f0 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65  apRegion, nReqRe
25900 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72  gion*sizeof(char
25910 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   *).    );.    i
25920 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
25930 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
25940 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
25950 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
25960 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
25970 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
25980 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
25990 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
259a0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71  de->nRegion<nReq
259b0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
259c0 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67  int nMap = szReg
259d0 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ion*nShmPerMap;.
259e0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
259f0 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
25a00 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
25a10 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
25a20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70     pMem = osMmap
25a30 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20  (0, nMap,.      
25a40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25a50 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
25a60 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
25a70 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
25a80 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
25a90 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
25aa0 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69  ->h, szRegion*(i
25ab0 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  64)pShmNode->nRe
25ac0 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a  gion.        );.
25ad0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
25ae0 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
25af0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
25b00 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
25b10 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
25b20 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64   "mmap", pShmNod
25b30 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
25b40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
25b50 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
25b60 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
25b70 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
25b80 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
25b90 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  4(szRegion);.   
25ba0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
25bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
25bc0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
25bd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
25be0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
25bf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25c00 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
25c10 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
25c20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
25c30 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72  r(i=0; i<nShmPer
25c40 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Map; i++){.     
25c50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
25c60 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
25c70 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28  nRegion+i] = &((
25c80 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65  char*)pMem)[szRe
25c90 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d  gion*i];.      }
25ca0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
25cb0 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d  >nRegion += nShm
25cc0 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20  PerMap;.    }.  
25cd0 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
25ce0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
25cf0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
25d00 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68  ){.    *pp = pSh
25d10 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
25d20 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73  iRegion];.  }els
25d30 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
25d40 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
25d50 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26  de->isReadonly &
25d60 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
25d70 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45  ) rc = SQLITE_RE
25d80 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65  ADONLY;.  sqlite
25d90 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
25da0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
25db0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25dc0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
25dd0 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
25de0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
25df0 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  segment..**.** N
25e00 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c  ote that the rel
25e10 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
25e20 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43  n SHAREd and EXC
25e30 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20  LUSIVE locks is 
25e40 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66  a little.** diff
25e50 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20  erent here than 
25e60 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53  in posix.  In xS
25e70 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61  hmLock(), one ca
25e80 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  n go from unlock
25e90 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20  ed.** to shared 
25ea0 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d  and back or from
25eb0 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63   unlocked to exc
25ec0 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e  lusive and back.
25ed0 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a    But one may.**
25ee0 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61   not go from sha
25ef0 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  red to exclusive
25f00 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69   or from exclusi
25f10 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f  ve to shared..*/
25f20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25f30 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  ShmLock(.  sqlit
25f40 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
25f50 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
25f60 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
25f70 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
25f80 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74   /* First lock t
25fb0 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
25fc0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  ease */.  int n,
25fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fe0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25ff0 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69  f locks to acqui
26000 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
26010 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26030 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
26040 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a   the lock */.){.
26050 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
26060 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
26070 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  d;      /* Conne
26080 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68  ction holding sh
26090 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
260a0 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
260b0 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
260c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
260d0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e  ared memory bein
260e0 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  g locked */.  un
260f0 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  ixShm *pX;      
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26110 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
26120 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c  ng over all sibl
26130 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ings */.  unixSh
26140 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
26150 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20  = p->pShmNode;  
26160 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
26170 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a  g file iNode */.
26180 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26190 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
261a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
261b0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
261c0 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
261f0 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
26200 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
26210 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
26220 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
26230 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
26240 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
26250 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
26260 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
26270 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
26280 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
26290 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
262a0 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
262b0 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
262c0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
262d0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
262e0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
262f0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
26300 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
26310 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
26320 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
26330 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
26340 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
26350 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
26360 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
26370 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
26380 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
26390 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
263a0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
263b0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
263c0 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)!=0 );.  asser
263d0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
263e0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
263f0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
26400 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
26410 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
26420 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
26430 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
26440 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31   );..  mask = (1
26450 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
26460 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72  <<ofst);.  asser
26470 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d  t( n>1 || mask==
26480 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73  (1<<ofst) );.  s
26490 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
264a0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
264b0 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ex);.  if( flags
264c0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
264d0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  LOCK ){.    u16 
264e0 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20  allMask = 0; /* 
264f0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65  Mask of locks he
26500 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a  ld by siblings *
26510 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66  /..    /* See if
26520 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f   any siblings ho
26530 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63  ld this same loc
26540 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d  k */.    for(pX=
26550 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
26560 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
26570 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
26580 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
26590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
265a0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28  pX->exclMask & (
265b0 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73  p->exclMask|p->s
265c0 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29  haredMask))==0 )
265d0 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20  ;.      allMask 
265e0 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
265f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
26600 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74   Unlock the syst
26610 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a  em-level locks *
26620 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20  /.    if( (mask 
26630 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b  & allMask)==0 ){
26640 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
26650 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
26660 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66  bFd, F_UNLCK, of
26670 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
26680 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
26690 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
266a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
266b0 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
266c0 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
266d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
266e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
266f0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
26700 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
26710 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
26720 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
26730 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
26740 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
26750 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
26760 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
26770 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
26780 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
26790 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
267a0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
267b0 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
267c0 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
267d0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
267e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
267f0 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
26800 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
26810 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
26820 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
26830 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
26840 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
26850 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
26860 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
26870 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
26880 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
26890 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
268a0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
268b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
268c0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
268d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
268e0 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
268f0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
26900 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
26910 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
26920 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
26930 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
26940 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26960 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
26970 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
26980 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
26990 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
269a0 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  d, F_RDLCK, ofst
269b0 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
269c0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
269d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
269e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
269f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
26a00 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
26a10 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
26a20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
26a40 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
26a50 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
26a60 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
26a70 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
26a80 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
26a90 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
26aa0 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
26ab0 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
26ac0 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
26ad0 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
26ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
26af0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
26b00 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
26b10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
26b20 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
26b30 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
26b40 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
26b50 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
26b60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26b70 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
26b80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26b90 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
26ba0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
26bb0 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
26bc0 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
26bd0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
26be0 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
26bf0 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
26c00 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
26c10 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
26c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
26c40 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
26c50 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43  ck(pDbFd, F_WRLC
26c60 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
26c70 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
26c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
26ca0 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
26cb0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
26cc0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
26cd0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
26ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26cf0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
26d00 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
26d10 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
26d20 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
26d30 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
26d40 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  got %03x,%03x\n"
26d50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
26d60 69 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c  id, osGetpid(0),
26d70 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
26d80 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
26d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26da0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
26db0 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
26dc0 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
26dd0 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
26de0 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
26df0 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
26e00 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
26e10 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
26e20 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
26e30 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
26e40 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
26e50 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
26e60 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
26e70 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
26e80 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
26e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
26ea0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
26eb0 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
26ec0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
26ed0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26ee0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65  fd);.  sqlite3Me
26ef0 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20  moryBarrier();  
26f00 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c         /* compil
26f10 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72  er-defined memor
26f20 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75  y barrier */.  u
26f30 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f50 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
26f60 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
26f70 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26f80 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
26f90 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
26fa0 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
26fb0 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
26fc0 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
26fd0 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
26fe0 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
26ff0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
27000 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
27010 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
27020 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
27030 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
27040 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
27050 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
27060 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
27070 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
27080 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
27090 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
270a0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
270b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
270c0 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
270d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
270e0 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
270f0 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
27100 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
27130 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
27140 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
27150 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
27160 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
27170 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
27180 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
27190 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
271c0 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
271d0 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
271e0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27200 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
27210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27220 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
27230 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
27240 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
27250 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
27260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
27270 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
27280 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
27290 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
272a0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
272b0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
272c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
272d0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
272e0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
272f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
27300 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
27310 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
27320 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
27330 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
27340 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
27350 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
27360 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
27370 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
27380 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
27390 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
273a0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
273b0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
273c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
273d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
273e0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
273f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
27400 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
27410 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
27420 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
27430 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
27440 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
27450 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
27460 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
27470 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
27480 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
27490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
274a0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
274b0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
274c0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
274d0 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
274e0 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
274f0 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
27500 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  h>=0 ){.      os
27510 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
27520 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
27530 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75   }.    unixShmPu
27540 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
27550 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
27560 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
27570 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
27580 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
27590 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
275a0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
275b0 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
275c0 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
275d0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
275e0 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
275f0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
27600 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
27610 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
27620 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
27630 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
27640 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
27650 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
27660 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
27670 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
27680 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
27690 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
276a0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
276b0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
276c0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
276d0 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
276e0 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
276f0 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
27700 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
27710 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
27720 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
27730 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
27740 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
27750 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
27760 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
27770 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
27780 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
27790 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
277a0 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
277b0 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
277c0 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
277d0 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
277e0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
277f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
27800 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
27810 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
27820 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
27830 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
27840 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
27850 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
27860 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
27870 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
27880 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
27890 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
278a0 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
278b0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
278c0 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
278d0 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
278e0 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
278f0 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
27900 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
27910 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
27920 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
27930 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
27940 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
27950 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
27960 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
27970 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
27980 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
27990 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
279a0 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
279b0 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
279e0 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
279f0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
27a00 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
27a10 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a30 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
27a40 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
27a50 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
27a60 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
27a70 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
27a80 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
27a90 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
27aa0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
27ab0 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
27ac0 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
27ad0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
27ae0 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
27af0 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
27b00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
27b20 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
27b30 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
27b40 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
27b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27b60 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
27b70 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
27b80 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
27b90 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
27ba0 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
27bb0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
27bc0 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
27bd0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
27be0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
27bf0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
27c00 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
27c10 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
27c20 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
27c30 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
27c40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27c50 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
27c60 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
27c70 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
27c80 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
27c90 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
27ca0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
27cb0 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56  pOrig ){.#if HAV
27cc0 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34  E_MREMAP.    i64
27cd0 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d   nReuse = pFd->m
27ce0 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20  mapSize;.#else. 
27cf0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
27d00 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61  yspage = osGetpa
27d10 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
27d20 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
27d30 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
27d40 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e  Syspage-1));.#en
27d50 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71  dif.    u8 *pReq
27d60 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
27d70 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
27d80 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
27d90 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
27da0 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
27db0 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
27dc0 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
27dd0 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
27de0 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
27df0 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
27e00 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
27e10 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
27e20 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
27e30 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
27e40 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
27e50 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
27e60 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
27e70 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
27e80 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
27e90 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
27ea0 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
27eb0 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
27ec0 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
27ed0 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
27ee0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
27ef0 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
27f00 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
27f10 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
27f20 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
27f30 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
27f40 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
27f50 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
27f60 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
27f70 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
27f80 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
27f90 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
27fa0 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
27fb0 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
27fc0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
27fd0 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
27fe0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
27ff0 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
28000 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
28010 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
28020 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
28030 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
28040 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
28050 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
28060 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
28070 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
28080 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
28090 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
280a0 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
280b0 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
280c0 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
280d0 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
280e0 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
280f0 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
28100 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
28110 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
28120 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
28130 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
28140 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
28150 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
28160 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
28170 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
28180 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
28190 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
281a0 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
281b0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
281c0 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
281d0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
281e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
281f0 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
28200 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
28210 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
28220 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
28230 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
28240 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
28250 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
28260 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
28270 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
28280 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
28290 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
282a0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
282b0 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
282c0 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
282d0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
282e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
282f0 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
28300 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
28310 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
28320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
28330 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
28340 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
28350 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
28360 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
28370 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
28380 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
28390 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
283a0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
283b0 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
283c0 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
283d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
283e0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
283f0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
28400 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
28410 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
28420 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
28430 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
28440 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
28450 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
28460 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
28470 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
28480 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
28490 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
284a0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
284b0 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
284c0 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
284d0 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
284e0 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
284f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
28500 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
28510 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
28520 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
28530 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
28540 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
28550 2c 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61  , i64 nMap){.  a
28560 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
28570 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
28580 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
28590 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d   nMap>0 || (pFd-
285a0 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20  >mmapSize==0 && 
285b0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
285c0 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64  =0) );.  if( pFd
285d0 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
285e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
285f0 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
28600 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
28610 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
28620 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
28630 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
28640 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73  on */.    if( os
28650 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
28660 74 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20  tatbuf) ){.     
28670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28680 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
28690 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61  }.    nMap = sta
286a0 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20  tbuf.st_size;.  
286b0 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
286c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
286d0 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
286e0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
286f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  }..  assert( nMa
28700 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
28710 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
28720 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
28730 29 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70  );.  if( nMap!=p
28740 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
28750 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
28760 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
28770 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
28780 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
28790 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
287a0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
287b0 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
287c0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
287d0 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
287e0 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
287f0 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
28800 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
28810 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
28820 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
28830 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
28840 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
28850 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
28860 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
28870 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
28880 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
28890 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
288a0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
288b0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
288c0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
288d0 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
288e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
288f0 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
28900 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
28910 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
28920 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
28930 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
28940 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
28950 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
28960 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
28970 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
28980 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
28990 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20  lly .** release 
289a0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
289b0 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66   calling unixUnf
289c0 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
289d0 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28  c int unixFetch(
289e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
289f0 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
28a00 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
28a10 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
28a20 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
28a30 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
28a40 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
28a50 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
28a60 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
28a70 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
28a80 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54   = 0;..#if SQLIT
28a90 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
28aa0 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  0.  if( pFd->mma
28ab0 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20  pSizeMax>0 ){.  
28ac0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
28ad0 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  egion==0 ){.    
28ae0 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d    int rc = unixM
28af0 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
28b00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28b10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28b20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28b30 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
28b40 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
28b50 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
28b60 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
28b70 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
28b80 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
28b90 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
28ba0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
28bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
28bc0 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
28bd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
28be0 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
28bf0 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
28c00 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e  es a .** referen
28c10 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
28c20 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
28c30 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54  o unixFetch(). T
28c40 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
28c50 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
28c60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
28c70 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
28c80 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
28c90 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
28ca0 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
28cb0 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68  to the unixFetch
28cc0 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a  () invocation. .
28cd0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
28ce0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
28cf0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
28d00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
28d10 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  eing called .** 
28d20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
28d30 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
28d40 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
28d50 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
28d60 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e  apping .** may n
28d70 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
28d80 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
28d90 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
28da0 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28  int unixUnfetch(
28db0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
28dc0 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64  , i64 iOff, void
28dd0 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
28de0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
28df0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
28e00 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
28e10 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
28e20 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
28e30 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44  file */.  UNUSED
28e40 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
28e50 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  ;..  /* If p==0 
28e60 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
28e70 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
28e80 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
28e90 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
28ea0 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
28eb0 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
28ec0 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
28ed0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
28ee0 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
28ef0 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
28f00 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
28f10 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
28f20 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
28f30 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
28f40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
28f50 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
28f60 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
28f70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
28f80 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
28f90 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
28fa0 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28  [iOff] );..  if(
28fb0 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
28fc0 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
28fd0 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
28fe0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
28ff0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
29000 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
29010 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
29020 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
29030 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29040 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
29050 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
29060 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
29070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29080 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
29090 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
290a0 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
290b0 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
290c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
290d0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
290e0 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
290f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
29100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29110 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
29120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
29160 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
29170 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
29180 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
29190 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
291a0 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
291b0 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
291c0 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
291d0 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
291e0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
291f0 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
29200 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
29210 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
29220 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
29230 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
29240 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
29250 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29260 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
29270 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
29280 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
29290 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
292a0 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
292b0 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
292c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
292d0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
292e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
292f0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
29300 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
29310 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
29320 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
29330 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
29340 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
29350 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
29360 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
29370 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
29380 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
29390 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
293a0 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
293b0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
293c0 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
293d0 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
293e0 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
293f0 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
29400 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
29410 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  nction F, two ob
29420 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
29430 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
29440 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
29450 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
29460 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
29470 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
29480 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
29490 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
294a0 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
294b0 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
294c0 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
294d0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
294e0 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
294f0 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
29500 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
29510 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
29520 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
29530 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
29540 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
29550 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
29560 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
29570 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
29580 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
29590 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
295a0 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
295b0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
295c0 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
295d0 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
295e0 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
295f0 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
29600 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
29610 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
29620 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
29630 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
29640 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
29650 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
29660 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
29670 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
29680 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
29690 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
296a0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
296b0 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
296c0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
296d0 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
296e0 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
296f0 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f  ODS(FINDER,METHO
29700 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c  D,VERSION,CLOSE,
29710 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f  LOCK,UNLOCK,CKLO
29720 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c  CK,SHMMAP)     \
29730 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
29740 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29750 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29780 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
297a0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
297b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
297d0 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
297f0 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29820 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29840 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29860 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29870 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
29880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29890 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
298c0 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
298d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
298e0 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29910 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
29920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
29930 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
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 5c 0a 20 20 20 75 6e 69          \.   uni
29960 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
29970 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
29980 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
29990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299a0 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
299b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
299c0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
299d0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
29a00 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
29a10 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29a20 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
29a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a40 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
29a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29a60 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
29a70 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a90 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
29aa0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
29ab0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
29ac0 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ae0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
29af0 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
29b00 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
29b10 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b30 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
29b40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
29b50 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
29b60 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20   \.   SHMMAP,   
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ba0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bd0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
29be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bf0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29c20 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
29c30 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
29c40 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
29c50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29c70 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c     unixShmUnmap,
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c90 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29cc0 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20    unixFetch,    
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ce0 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20   xFetch */      
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29d10 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20   unixUnfetch,   
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d30 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20  xUnfetch */     
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29da0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
29db0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29dc0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
29dd0 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
29de0 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
29df0 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
29e00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
29e10 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
29e20 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e40 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
29e50 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e90 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
29ef0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
29f00 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
29f10 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
29f20 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
29f30 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
29f40 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
29f50 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
29f60 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
29f70 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
29f80 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
29f90 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
29fa0 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
29fb0 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
29fc0 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
29fd0 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
29fe0 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
29ff0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
2a000 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
2a010 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2a020 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2a030 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
2a040 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2a050 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2a060 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2a070 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a0a0 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
2a0b0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2a0c0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2a0d0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a0e0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
2a0f0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a100 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a110 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
2a120 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2a130 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a140 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
2a150 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a160 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
2a170 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a180 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61  d */.  unixShmMa
2a190 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
2a1a0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2a1b0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2a1c0 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
2a1d0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
2a1e0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2a1f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
2a200 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2a210 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2a220 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2a230 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
2a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a250 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2a260 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2a270 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  led */.  nolockC
2a280 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2a290 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2a2a0 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c  hod */.  nolockL
2a2b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a2c0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2a2d0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  od */.  nolockUn
2a2e0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2a2f0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2a300 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  hod */.  nolockC
2a310 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a320 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  ,  /* xCheckRese
2a330 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2a340 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a360 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2a370 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
2a380 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
2a390 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
2a3a0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2a3b0 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
2a3c0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
2a3d0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2a3e0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a3f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2a420 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2a430 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
2a440 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2a450 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2a460 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
2a470 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a480 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2a490 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
2a4a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a4b0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a4c0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
2a4d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2a4e0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a4f0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2a500 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a520 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2a530 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
2a540 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a550 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2a560 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
2a570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2a580 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2a590 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
2a5a0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2a5b0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2a5c0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2a5d0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2a600 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2a610 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
2a620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a630 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2a640 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a660 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a670 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
2a680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a690 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2a6a0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
2a6b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2a6c0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a6d0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a6e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a700 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2a710 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
2a720 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
2a730 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
2a740 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2a750 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a760 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
2a770 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
2a780 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a790 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a7a0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2a7b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a7d0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a7e0 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43  abled */.  semXC
2a7f0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2a800 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a810 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c  ethod */.  semXL
2a820 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a830 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a840 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e  thod */.  semXUn
2a850 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2a860 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a870 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43  ethod */.  semXC
2a880 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a890 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
2a8a0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a8b0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2a8e0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2a8f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2a900 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2a910 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a920 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
2a930 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a950 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2a960 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
2a970 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a980 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2a990 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a9a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9c0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2a9d0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2a9e0 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2aa10 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa30 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2aa40 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2aa70 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
2aa80 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2aa90 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2aaa0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2aab0 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aad0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2aae0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.).#endif../*.*
2aaf0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2ab00 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20  ing method is a 
2ab10 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69  "super-method" i
2ab20 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
2ab30 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63   it.** opens sec
2ab40 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63  ondary file desc
2ab50 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20  riptors for the 
2ab60 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66  conch and lock f
2ab70 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75  iles and.** it u
2ab80 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66  ses proxy, dot-f
2ab90 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c  ile, AFP, and fl
2aba0 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65  ock() locking me
2abb0 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a  thods on those.*
2abc0 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  * secondary file
2abd0 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  s.  For this rea
2abe0 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
2abf0 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
2ac00 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s.** proxy locki
2ac10 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75  ng is located mu
2ac20 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20  ch further down 
2ac30 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75  in the file.  Bu
2ac40 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  t we need.** to 
2ac50 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66  go ahead and def
2ac60 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ine the sqlite3_
2ac70 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66  io_methods and f
2ac80 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a  inder function.*
2ac90 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  * for proxy lock
2aca0 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65  ing here.  So we
2acb0 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65   forward declare
2acc0 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
2acd0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
2ace0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2acf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ad00 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69  KING_STYLE.stati
2ad10 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
2ad20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
2ad30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2ad40 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
2ad50 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
2ad60 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
2ad70 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2ad80 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
2ad90 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
2ada0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
2adb0 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49  _file*, int*);.I
2adc0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78  OMETHODS(.  prox
2add0 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  yIoFinder,      
2ade0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2adf0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2ae00 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  .  proxyIoMethod
2ae10 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2ae20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2ae30 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2ae40 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae60 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2ae70 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2ae80 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20  proxyClose,     
2ae90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2aea0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2aeb0 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20  proxyLock,      
2aec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2aed0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
2aee0 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  roxyUnlock,     
2aef0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2af00 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2af10 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
2af20 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68  edLock,   /* xCh
2af30 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2af40 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af60 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2af70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2af80 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
2af90 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
2afa0 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
2afb0 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
2afc0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
2afd0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2afe0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2aff0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b000 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
2b010 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
2b020 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2b030 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2b040 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
2b050 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
2b060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2b070 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b080 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2b090 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2b0b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2b0c0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e  disabled */.  un
2b0d0 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
2b0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2b0f0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
2b100 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
2b110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2b120 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
2b130 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
2b140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2b150 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2b160 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
2b170 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
2b180 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b190 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2b1c0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2b1d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
2b1e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2b1f0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2b200 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
2b210 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
2b220 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
2b230 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
2b240 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
2b250 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
2b260 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2b270 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
2b280 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
2b290 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
2b2a0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
2b2b0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
2b2c0 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
2b2d0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
2b2e0 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
2b2f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2b300 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2b310 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
2b320 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
2b330 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
2b340 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
2b350 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2b360 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
2b370 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
2b380 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
2b390 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
2b3a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
2b3b0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2b3c0 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
2b3d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2b3e0 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b400 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
2b410 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
2b420 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b430 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
2b440 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
2b450 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
2b460 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
2b470 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
2b480 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2b490 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
2b4a0 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
2b4b0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
2b4c0 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
2b4d0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
2b4e0 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
2b4f0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2b500 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
2b510 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2b520 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
2b530 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2b540 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2b550 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2b560 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
2b570 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
2b580 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
2b590 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
2b5a0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2b5b0 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
2b5c0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
2b5d0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2b5e0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
2b5f0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
2b600 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2b610 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
2b620 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
2b630 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
2b640 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
2b650 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
2b660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2b670 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2b680 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2b690 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
2b6a0 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
2b6b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2b6c0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2b6d0 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
2b6e0 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
2b6f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2b700 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
2b710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b720 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
2b730 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
2b740 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
2b750 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
2b760 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2b770 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
2b780 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
2b790 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
2b7a0 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
2b7b0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
2b7c0 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
2b7d0 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
2b7e0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2b7f0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2b800 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2b810 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2b820 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2b830 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2b840 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2b850 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2b860 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2b870 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20  =-1 ) {.    if( 
2b880 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2b890 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
2b8a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ")==0 ){.      r
2b8b0 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68  eturn &nfsIoMeth
2b8c0 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ods;.    } else 
2b8d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2b8e0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2b8f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b900 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
2b910 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2b920 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
2b930 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b940 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
2b950 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
2b960 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2b970 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
2b980 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
2b990 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
2b9a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2b9b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b9c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
2b9d0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2b9e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  /*.** This "find
2b9f0 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  er" function for
2ba00 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20   VxWorks checks 
2ba10 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78 20  to see if posix 
2ba20 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b  advisory.** lock
2ba30 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69  ing works.  If i
2ba40 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61  t does, then tha
2ba50 74 20 69 73 20 77 68 61 74 20 69 73 20 75 73 65  t is what is use
2ba60 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  d.  If it does n
2ba70 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e  ot.** work, then
2ba80 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d   fallback to nam
2ba90 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
2baa0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
2bab0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2bac0 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b  _methods *vxwork
2bad0 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  sIoFinderImpl(. 
2bae0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
2baf0 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
2bb00 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2bb10 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
2bb20 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
2bb30 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
2bb40 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
2bb50 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
2bb60 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
2bb70 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
2bb80 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
2bb90 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
2bba0 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
2bbb0 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
2bbc0 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
2bbd0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
2bbe0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
2bbf0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
2bc00 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2bc10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
2bc20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
2bc30 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
2bc40 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
2bc50 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
2bc60 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
2bc70 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
2bc80 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
2bc90 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
2bca0 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
2bcb0 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
2bcc0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
2bcd0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
2bce0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
2bcf0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
2bd00 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
2bd10 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
2bd20 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
2bd30 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
2bd40 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2bd50 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
2bd60 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
2bd70 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
2bd80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2bd90 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76  ds .  *(*const v
2bda0 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28  xworksIoFinder)(
2bdb0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2bdc0 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73  File*) = vxworks
2bdd0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
2bde0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
2bdf0 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  RKS */../*.** An
2be00 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66   abstract type f
2be10 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
2be20 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e  an IO method fin
2be30 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
2be40 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
2be50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2be60 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
2be70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2be80 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
2be90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2beb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2bee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bef0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
2bf00 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
2bf10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bf20 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
2bf30 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
2bf40 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
2bf50 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
2bf60 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
2bf70 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
2bf80 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
2bf90 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
2bfa0 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
2bfb0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
2bfc0 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
2bfd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2bfe0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
2bff0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2c000 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
2c010 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2c020 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c040 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
2c050 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
2c060 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
2c070 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
2c080 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
2c090 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
2c0a0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2c0b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2c0c0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
2c0d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
2c0e0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
2c0f0 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
2c100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
2c110 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46  ro or more UNIXF
2c120 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ILE_* values */.
2c130 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
2c140 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
2c150 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
2c160 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
2c170 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
2c180 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c190 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2c1a0 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
2c1b0 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55  =NULL );..  /* U
2c1c0 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
2c1d0 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
2c1e0 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
2c1f0 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
2c200 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
2c210 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
2c220 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
2c230 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
2c240 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
2c250 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
2c260 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
2c270 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
2c280 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2c290 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2c2a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2c2b0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2c2c0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
2c2d0 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
2c2e0 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
2c2f0 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
2c300 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
2c310 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
2c320 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2c330 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2c340 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ' );.#endif..  /
2c350 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63  * No locking occ
2c360 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  urs in temporary
2c370 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65   files */.  asse
2c380 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2c390 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26   || (ctrlFlags &
2c3a0 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2c3b0 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  )!=0 );..  OSTRA
2c3c0 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE(("OPEN    %-3
2c3d0 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
2c3e0 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d  ename));.  pNew-
2c3f0 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
2c400 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2c410 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69  New->zPath = zFi
2c420 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e  lename;.  pNew->
2c430 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29  ctrlFlags = (u8)
2c440 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53  ctrlFlags;.#if S
2c450 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
2c460 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d  IZE>0.  pNew->mm
2c470 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69  apSizeMax = sqli
2c480 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2c490 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20  szMmap;.#endif. 
2c4a0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
2c4b0 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46  _boolean(((ctrlF
2c4c0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2c4d0 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65  URI) ? zFilename
2c4e0 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20   : 0),.         
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c500 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45    "psow", SQLITE
2c510 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
2c520 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65  RITE) ){.    pNe
2c530 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2c540 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20  UNIXFILE_PSOW;. 
2c550 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28   }.  if( strcmp(
2c560 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69  pVfs->zName,"uni
2c570 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20  x-excl")==0 ){. 
2c580 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2c590 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45  gs |= UNIXFILE_E
2c5a0 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  XCL;.  }..#if OS
2c5b0 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d  _VXWORKS.  pNew-
2c5c0 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69  >pId = vxworksFi
2c5d0 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61  ndFileId(zFilena
2c5e0 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  me);.  if( pNew-
2c5f0 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63  >pId==0 ){.    c
2c600 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2c610 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20  FILE_NOLOCK;.   
2c620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c630 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  EM_BKPT;.  }.#en
2c640 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46  dif..  if( ctrlF
2c650 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2c660 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c  NOLOCK ){.    pL
2c670 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
2c680 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2c690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
2c6a0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a  ckingStyle = (**
2c6b0 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56  (finder_type*)pV
2c6c0 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46  fs->pAppData)(zF
2c6d0 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a  ilename, pNew);.
2c6e0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2c6f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2c700 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69      /* Cache zFi
2c710 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f  lename in the lo
2c720 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41  cking context (A
2c730 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f  FP and dotlock o
2c740 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20  verride) for.   
2c750 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63   ** proxyLock ac
2c760 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73  tivation is poss
2c770 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f  ible (remote pro
2c780 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64  xy is based on d
2c790 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a  b name).    ** z
2c7a0 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73  Filename remains
2c7b0 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c   valid until fil
2c7c0 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20  e is closed, to 
2c7d0 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70  support */.    p
2c7e0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2c7f0 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69  ext = (void*)zFi
2c800 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  lename;.#endif. 
2c810 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69   }..  if( pLocki
2c820 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69  ngStyle == &posi
2c830 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64  xIoMethods.#if d
2c840 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2c850 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2c860 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2c870 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67  .    || pLocking
2c880 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d  Style == &nfsIoM
2c890 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20  ethods.#endif.  
2c8a0 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
2c8b0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
2c8c0 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2c8d0 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2c8e0 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
2c8f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c900 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
2c910 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
2c920 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c  findInodeInfo(),
2c930 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
2c940 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20  descriptor.     
2c950 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c   ** immediately,
2c960 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e   before releasin
2c970 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e  g the mutex. fin
2c980 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79  dInodeInfo() may
2c990 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69   fail.      ** i
2c9a0 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
2c9b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2c9c0 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20  **   (a) A call 
2c9d0 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65  to fstat() faile
2c9e0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62  d..      **   (b
2c9f0 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  ) A malloc faile
2ca00 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
2ca10 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62    ** Scenario (b
2ca20 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72  ) may only occur
2ca30 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
2ca40 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74  is holding no ot
2ca50 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  her.      ** fil
2ca60 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
2ca70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
2ca80 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65  ile. If there we
2ca90 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20  re other file.  
2caa0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
2cab0 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c  rs on this file,
2cac0 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20   then no malloc 
2cad0 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65  would be require
2cae0 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69  d by.      ** fi
2caf0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49  ndInodeInfo(). I
2cb00 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
2cb10 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20  se, it is quite 
2cb20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20  safe to close.  
2cb30 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20      ** handle h 
2cb40 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61  - as it is guara
2cb50 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f  nteed that no po
2cb60 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62  six locks will b
2cb70 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20  e released.     
2cb80 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e   ** by doing so.
2cb90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2cba0 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28  ** If scenario (
2cbb0 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72  a) caused the er
2cbc0 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20  ror then things 
2cbd0 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e  are not so safe.
2cbe0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d   The.      ** im
2cbf0 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f  plicit assumptio
2cc00 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69  n here is that i
2cc10 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c  f fstat() fails,
2cc20 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20   things are in. 
2cc30 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64       ** such bad
2cc40 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70   shape that drop
2cc50 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74  ping a lock or t
2cc60 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  wo doesn't matte
2cc70 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f  r much..      */
2cc80 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
2cc90 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2cca0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20  INE__);.      h 
2ccb0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2ccc0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2ccd0 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
2cce0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2ccf0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
2cd00 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65  d(__APPLE__).  e
2cd10 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2cd20 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d  Style == &afpIoM
2cd30 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2cd40 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65   AFP locking use
2cd50 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
2cd60 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
2cd70 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
2cd80 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b    ** the afpLock
2cd90 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ingContext..    
2cda0 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e  */.    afpLockin
2cdb0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
2cdc0 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2cdd0 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20  gContext = pCtx 
2cde0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2cdf0 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  64( sizeof(*pCtx
2ce00 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
2ce10 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
2ce20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2ce30 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
2ce40 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46  .      /* NB: zF
2ce50 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61  ilename exists a
2ce60 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  nd remains valid
2ce70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20   until the file 
2ce80 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20  is closed.      
2ce90 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
2cea0 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31  requirement F111
2ceb0 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f  41.  So we do no
2cec0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
2ced0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
2cee0 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20  f the filename. 
2cef0 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64  */.      pCtx->d
2cf00 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  bPath = zFilenam
2cf10 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72  e;.      pCtx->r
2cf20 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20  eserved = 0;.   
2cf30 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b     srandomdev();
2cf40 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72  .      unixEnter
2cf50 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72  Mutex();.      r
2cf60 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2cf70 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2cf80 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66  Inode);.      if
2cf90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cfa0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2cfb0 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f  e3_free(pNew->lo
2cfc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
2cfd0 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
2cfe0 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2cff0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
2d000 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
2d010 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
2d020 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a  utex();        .
2d030 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2d040 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ..  else if( pLo
2d050 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64  ckingStyle == &d
2d060 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
2d070 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c  ){.    /* Dotfil
2d080 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
2d090 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
2d0a0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
2d0b0 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
2d0c0 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
2d0d0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20  kingContext .   
2d0e0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
2d0f0 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74  ockFile;.    int
2d100 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   nFilename;.    
2d110 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2d120 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c  e!=0 );.    nFil
2d130 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72  ename = (int)str
2d140 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  len(zFilename) +
2d150 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c   6;.    zLockFil
2d160 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
2d170 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69  te3_malloc64(nFi
2d180 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
2d190 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
2d1a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2d1b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d1c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d1d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2d1e0 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63  (nFilename, zLoc
2d1f0 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c  kFile, "%s" DOTL
2d200 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c  OCK_SUFFIX, zFil
2d210 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
2d220 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
2d230 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69  ontext = zLockFi
2d240 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  le;.  }..#if OS_
2d250 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69  VXWORKS.  else i
2d260 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2d270 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64   == &semIoMethod
2d280 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65  s ){.    /* Name
2d290 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
2d2a0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2d2b0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2d2c0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
2d2d0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
2d2e0 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  semLockingContex
2d2f0 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69  t.    */.    uni
2d300 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2d310 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2d320 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2d330 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2d340 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
2d350 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49  OK) && (pNew->pI
2d360 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  node->pSem==NULL
2d370 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
2d380 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
2d390 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
2d3a0 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  me;.      int n;
2d3b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2d3c0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
2d3d0 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20  NAME, zSemName, 
2d3e0 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20  "/%s.sem",.     
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d400 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61    pNew->pId->zCa
2d410 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
2d420 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53      for( n=1; zS
2d430 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29  emName[n]; n++ )
2d440 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65  .        if( zSe
2d450 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20  mName[n]=='/' ) 
2d460 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f  zSemName[n] = '_
2d470 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ';.      pNew->p
2d480 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65  Inode->pSem = se
2d490 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c  m_open(zSemName,
2d4a0 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20   O_CREAT, 0666, 
2d4b0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1);.      if( pN
2d4c0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2d4d0 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29   == SEM_FAILED )
2d4e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2d4f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2d500 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2d510 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2d520 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
2d530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2d540 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2d550 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2d560 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2d570 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f  New, 0);.#if OS_
2d580 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
2d590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d5a0 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
2d5b0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2d5c0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2d5d0 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f     h = -1;.    o
2d5e0 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d  sUnlink(zFilenam
2d5f0 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  e);.    pNew->ct
2d600 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2d610 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a  ILE_DELETE;.  }.
2d620 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
2d630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d640 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2d650 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2d660 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2d670 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
2d680 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
2d690 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
2d6a0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
2d6b0 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28     verifyDbFile(
2d6c0 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pNew);.  }.  ret
2d6d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d6e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
2d6f0 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20   of a directory 
2d700 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20  in which to put 
2d710 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
2d720 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
2d730 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
2d740 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20  e directory can 
2d750 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
2d760 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
2d770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
2d780 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69  xTempFileDir(voi
2d790 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
2d7a0 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
2d7b0 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
2d7c0 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
2d7d0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
2d7e0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
2d7f0 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20  mp",.     ".".  
2d800 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  };.  unsigned in
2d810 74 20 69 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  t i = 0;.  struc
2d820 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
2d830 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
2d840 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
2d850 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20  rectory;..  if( 
2d860 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44  !azDirs[0] ) azD
2d870 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28  irs[0] = getenv(
2d880 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
2d890 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b  ;.  if( !azDirs[
2d8a0 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d  1] ) azDirs[1] =
2d8b0 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
2d8c0 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  );.  while(1){. 
2d8d0 20 20 20 69 66 28 20 7a 44 69 72 21 3d 30 0a 20     if( zDir!=0. 
2d8e0 20 20 20 20 26 26 20 6f 73 53 74 61 74 28 7a 44      && osStat(zD
2d8f0 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20 20  ir, &buf)==0.   
2d900 20 20 26 26 20 53 5f 49 53 44 49 52 28 62 75 66    && S_ISDIR(buf
2d910 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 26  .st_mode).     &
2d920 26 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c  & osAccess(zDir,
2d930 20 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20   03)==0.    ){. 
2d940 20 20 20 20 20 72 65 74 75 72 6e 20 7a 44 69 72       return zDir
2d950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d960 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  i>=sizeof(azDirs
2d970 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
2d980 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  0]) ) break;.   
2d990 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69   zDir = azDirs[i
2d9a0 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++];.  }.  retur
2d9b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
2d9c0 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
2d9d0 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
2d9e0 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
2d9f0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
2da00 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
2da10 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
2da20 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
2da30 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
2da40 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2da50 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
2da60 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
2da70 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
2da80 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2da90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2daa0 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
2dab0 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f   0;..  /* It's o
2dac0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
2dad0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
2dae0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
2daf0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
2db00 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
2db10 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
2db20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
2db30 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
2db40 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
2db50 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
2db60 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 53  zBuf[0] = 0;.  S
2db70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2db80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2db90 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
2dba0 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2dbb0 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
2dbc0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2dbd0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
2dbe0 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  ATH;.  do{.    u
2dbf0 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  64 r;.    sqlite
2dc00 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
2dc10 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
2dc20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20   assert( nBuf>2 
2dc30 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66  );.    zBuf[nBuf
2dc40 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  -2] = 0;.    sql
2dc50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2dc60 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  uf, zBuf, "%s/"S
2dc70 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
2dc80 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a  PREFIX"%llx%c",.
2dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dca0 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29       zDir, r, 0)
2dcb0 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e  ;.    if( zBuf[n
2dcc0 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c  Buf-2]!=0 || (iL
2dcd0 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74  imit++)>10 ) ret
2dce0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2dcf0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
2dd00 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
2dd10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2dd20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
2dd30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2dd40 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2dd50 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2dd60 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
2dd70 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
2dd80 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
2dd90 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
2dda0 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
2ddb0 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
2ddc0 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
2ddd0 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
2dde0 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
2ddf0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2de00 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
2de10 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2de20 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
2de30 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
2de40 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
2de50 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
2de60 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
2de70 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2de80 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
2de90 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
2dea0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
2deb0 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
2dec0 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
2ded0 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
2dee0 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
2def0 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
2df00 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
2df10 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
2df20 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
2df30 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
2df40 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2df50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
2df60 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2df70 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
2df80 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2df90 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
2dfa0 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
2dfb0 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
2dfc0 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
2dfd0 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
2dfe0 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
2dff0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e000 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2e010 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
2e020 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
2e030 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
2e040 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
2e050 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
2e060 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
2e070 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
2e080 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
2e090 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
2e0a0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2e0b0 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
2e0c0 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
2e0d0 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
2e0e0 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
2e0f0 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
2e100 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
2e110 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
2e120 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
2e130 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
2e140 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
2e150 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
2e160 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
2e170 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
2e180 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
2e190 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
2e1a0 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
2e1b0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2e1c0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
2e1d0 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
2e1e0 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2e1f0 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
2e200 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
2e210 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
2e220 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
2e230 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
2e240 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
2e250 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
2e260 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
2e270 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
2e280 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
2e290 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
2e2a0 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
2e2b0 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
2e2c0 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
2e2d0 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
2e2e0 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
2e2f0 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
2e300 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
2e310 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2e320 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2e330 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
2e340 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
2e350 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
2e360 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
2e370 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
2e380 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
2e390 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
2e3a0 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
2e3b0 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
2e3c0 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
2e3d0 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
2e3e0 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
2e3f0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
2e400 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2e410 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
2e420 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
2e430 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
2e440 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
2e450 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2e460 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
2e470 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
2e480 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
2e490 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
2e4a0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
2e4b0 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
2e4c0 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
2e4d0 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
2e4e0 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
2e4f0 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
2e500 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
2e510 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
2e520 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c  r a reusable fil
2e530 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2e540 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
2e550 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2e560 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
2e570 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2e580 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
2e590 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2e5a0 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
2e5b0 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
2e5c0 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
2e5d0 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
2e5e0 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
2e5f0 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
2e600 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
2e610 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75  ->fileId.ino!=(u
2e620 36 34 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  64)sStat.st_ino)
2e630 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
2e640 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
2e650 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2e660 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
2e670 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
2e680 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
2e690 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
2e6a0 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
2e6b0 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
2e6c0 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
2e6d0 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
2e6e0 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
2e6f0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2e700 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75        *pp = pUnu
2e710 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  sed->pNext;.    
2e720 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2e730 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2e740 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a    }.#endif    /*
2e750 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
2e760 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
2e770 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  sed;.}../*.** Fi
2e780 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64  nd the mode, uid
2e790 20 61 6e 64 20 67 69 64 20 6f 66 20 66 69 6c 65   and gid of file
2e7a0 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74 61 74   zFile. .*/.stat
2e7b0 69 63 20 69 6e 74 20 67 65 74 46 69 6c 65 4d 6f  ic int getFileMo
2e7c0 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
2e7d0 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *zFile,        
2e7e0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
2e7f0 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  me */.  mode_t *
2e800 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2e810 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e820 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 7a  Permissions of z
2e830 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f 74 20  File */.  uid_t 
2e840 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20  *pUid,          
2e850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2e860 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20  : uid of zFile. 
2e870 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64  */.  gid_t *pGid
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e890 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64       /* OUT: gid
2e8a0 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 29 7b   of zFile. */.){
2e8b0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2e8c0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2e8d0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20     /* Output of 
2e8e0 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61  stat() on databa
2e8f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2e900 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e910 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
2e920 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74 29 20  (zFile, &sStat) 
2e930 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2e940 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2e950 30 37 37 37 3b 0a 20 20 20 20 2a 70 55 69 64 20  0777;.    *pUid 
2e960 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a  = sStat.st_uid;.
2e970 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
2e980 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65 6c 73  t.st_gid;.  }els
2e990 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
2e9a0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
2e9b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e9c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2e9d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2e9e0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
2e9f0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2ea00 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
2ea10 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
2ea20 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
2ea30 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2ea40 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2ea50 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
2ea60 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
2ea70 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
2ea80 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
2ea90 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
2eaa0 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
2eab0 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
2eac0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2ead0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
2eae0 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
2eaf0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2eb00 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
2eb10 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
2eb20 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
2eb30 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2eb40 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2eb50 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2eb60 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2eb70 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2eb80 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2eb90 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2eba0 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2ebb0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2ebc0 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2ebd0 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2ebe0 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2ebf0 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2ec00 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2ec10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2ec20 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2ec30 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2ec40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2ec50 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2ec60 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2ec70 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2ec80 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2ec90 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2eca0 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2ecb0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2ecc0 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2ecd0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2ece0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2ecf0 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2ed00 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2ed10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2ed20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2ed30 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2ed40 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2ed50 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2ed60 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2ed70 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2ed80 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2ed90 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2eda0 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2edb0 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2edc0 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2edd0 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2ede0 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2edf0 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2ee00 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2ee10 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2ee20 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2ee30 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2ee40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2ee50 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2ee60 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2ee70 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2ee80 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2ee90 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2eea0 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2eeb0 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2eec0 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2eed0 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2eee0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2eef0 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2ef00 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2ef10 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef30 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2ef40 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2ef50 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2ef60 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2ef70 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2ef80 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2ef90 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2efa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2efb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2efc0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2efd0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2efe0 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2eff0 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2f000 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2f010 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2f020 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2f030 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2f040 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2f050 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2f060 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2f070 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f090 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2f0a0 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2f0b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74   */..    /* zPat
2f0c0 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61  h is a path to a
2f0d0 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   WAL or journal 
2f0e0 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  file. The follow
2f0f0 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65  ing block derive
2f100 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74  s.    ** the pat
2f110 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  h to the associa
2f120 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2f130 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68  e from zPath. Th
2f140 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
2f150 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
2f160 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e  owing naming con
2f170 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a  ventions:.    **
2f180 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f190 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22   to db>-journal"
2f1a0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f1b0 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20   to db>-wal".   
2f1c0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2f1d0 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20  db>-journalNN". 
2f1e0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2f1f0 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20  o db>-walNN".   
2f200 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
2f210 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c   NN is a decimal
2f220 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20   number. The NN 
2f230 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61  naming schemes a
2f240 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  re .    ** used 
2f250 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74  by the test_mult
2f260 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a  iplex.c module..
2f270 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d      */.    nDb =
2f280 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2f290 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20  (zPath) - 1; .  
2f2a0 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e    while( zPath[n
2f2b0 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 23 69 66 6e  Db]!='-' ){.#ifn
2f2c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2f2d0 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20  E_8_3_NAMES.    
2f2e0 20 20 2f 2a 20 49 6e 20 74 68 65 20 6e 6f 72 6d    /* In the norm
2f2f0 61 6c 20 63 61 73 65 20 28 38 2b 33 20 66 69 6c  al case (8+3 fil
2f300 65 6e 61 6d 65 73 20 64 69 73 61 62 6c 65 64 29  enames disabled)
2f310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f320 65 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 69  ename.      ** i
2f330 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2f340 63 6f 6e 74 61 69 6e 20 61 20 27 2d 27 20 63 68  contain a '-' ch
2f350 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20  aracter. */.    
2f360 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20    assert( nDb>0 
2f370 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f380 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28   sqlite3Isalnum(
2f390 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 3b 0a 23  zPath[nDb]) );.#
2f3a0 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
2f3b0 20 38 2b 33 20 6e 61 6d 65 73 20 61 72 65 20 70   8+3 names are p
2f3c0 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e 20 74 68  ossible, then th
2f3d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
2f3e0 69 67 68 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  ight not contain
2f3f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 27 2d 27 20  .      ** a '-' 
2f400 63 68 61 72 61 63 74 65 72 2e 20 20 53 6f 20 63  character.  So c
2f410 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 63 61  heck for that ca
2f420 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 65 61  se and return ea
2f430 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  rly. */.      if
2f440 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74  ( nDb==0 || zPat
2f450 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65  h[nDb]=='.' ) re
2f460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f470 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 44 62  #endif.      nDb
2f480 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  --;.    }.    me
2f490 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c  mcpy(zDb, zPath,
2f4a0 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e   nDb);.    zDb[n
2f4b0 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  Db] = '\0';..   
2f4c0 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64   rc = getFileMod
2f4d0 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c 20 70 55  e(zDb, pMode, pU
2f4e0 69 64 2c 20 70 47 69 64 29 3b 0a 23 69 66 64 65  id, pGid);.#ifde
2f4f0 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f  f SQLITE_SERVER_
2f500 45 44 49 54 49 4f 4e 0a 20 20 20 20 69 66 28 20  EDITION.    if( 
2f510 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
2f520 5f 46 53 54 41 54 20 29 7b 0a 20 20 20 20 20 20  _FSTAT ){.      
2f530 77 68 69 6c 65 28 20 6e 44 62 20 26 26 20 7a 44  while( nDb && zD
2f540 62 5b 6e 44 62 5d 21 3d 27 2f 27 20 29 20 6e 44  b[nDb]!='/' ) nD
2f550 62 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  b--;.      if( n
2f560 44 62 3e 38 20 26 26 20 6d 65 6d 63 6d 70 28 22  Db>8 && memcmp("
2f570 2d 6a 6f 75 72 6e 61 6c 2f 22 2c 20 26 7a 44 62  -journal/", &zDb
2f580 5b 6e 44 62 2d 38 5d 2c 20 39 29 3d 3d 30 20 29  [nDb-8], 9)==0 )
2f590 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 5b 6e 44  {.        zDb[nD
2f5a0 62 2d 38 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  b-8] = '\0';.   
2f5b0 20 20 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c       rc = getFil
2f5c0 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65  eMode(zDb, pMode
2f5d0 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20  , pUid, pGid);. 
2f5e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f5f0 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
2f600 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2f610 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2f620 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  E ){.    *pMode 
2f630 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20  = 0600;.  }else 
2f640 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2f650 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20  TE_OPEN_URI ){. 
2f660 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2f670 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65   a main database
2f680 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
2f690 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73  le was opened us
2f6a0 69 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a 2a  ing a URI.    **
2f6b0 20 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b   filename, check
2f6c0 20 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f 66   for the "modeof
2f6d0 22 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20  " parameter. If 
2f6e0 70 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70 72  present, interpr
2f6f0 65 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76 61  et.    ** its va
2f700 6c 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61 6d  lue as a filenam
2f710 65 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f 70  e and try to cop
2f720 79 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20  y the mode, uid 
2f730 61 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20 20  and gid from.   
2f740 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20 20   ** that file.  
2f750 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
2f760 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
2f770 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50 61  ri_parameter(zPa
2f780 74 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20  th, "modeof");. 
2f790 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
2f7a0 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f    rc = getFileMo
2f7b0 64 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69  de(z, pMode, pUi
2f7c0 64 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a  d, pGid);.    }.
2f7d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
2f7f0 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
2f800 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
2f810 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
2f820 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
2f830 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
2f840 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
2f850 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
2f860 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
2f870 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
2f880 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2f890 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
2f8a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
2f8b0 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
2f8c0 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
2f8d0 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
2f8e0 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
2f8f0 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
2f900 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
2f910 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
2f920 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
2f930 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
2f940 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
2f950 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
2f960 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
2f970 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
2f980 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
2f990 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
2f9a0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
2f9b0 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
2f9c0 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
2f9d0 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
2f9e0 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
2f9f0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
2fa00 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
2fa10 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
2fa20 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
2fa30 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
2fa40 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
2fa50 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
2fa60 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
2fa70 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
2fa80 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
2fa90 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
2faa0 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
2fab0 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
2fac0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2fad0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2fae0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2faf0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
2fb00 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
2fb10 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
2fb20 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
2fb30 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2fb40 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
2fb50 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
2fb60 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
2fb70 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
2fb80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
2fb90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2fba0 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
2fbb0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbd0 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
2fbe0 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
2fbf0 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
2fc00 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
2fc10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2fc20 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
2fc30 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
2fc40 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
2fc50 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
2fc60 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
2fc70 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
2fc80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2fc90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
2fca0 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
2fcb0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   */.  int openFl
2fcc0 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
2fcd0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
2fce0 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20   pass to open() 
2fcf0 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
2fd00 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
2fd10 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
2fd20 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
2fd30 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
2fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd50 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
2fd60 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
2fd70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
2fd80 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2fd90 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2fda0 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
2fdb0 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67  /.  int ctrlFlag
2fdc0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2fdd0 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a     /* UNIXFILE_*
2fde0 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74   flags */..  int
2fdf0 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
2fe00 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2fe10 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
2fe20 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
2fe30 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
2fe40 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
2fe50 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
2fe60 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
2fe70 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2fe80 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
2fe90 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
2fea0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2feb0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2fec0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
2fed0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
2fee0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2fef0 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c  DWRITE);.#if SQL
2ff00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ff10 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69  NG_STYLE.  int i
2ff20 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66  sAutoProxy  = (f
2ff30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2ff40 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23  EN_AUTOPROXY);.#
2ff50 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
2ff60 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
2ff70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2ff80 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
2ff90 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2ffa0 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  fo;.#endif..  /*
2ffb0 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d   If creating a m
2ffc0 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69  aster or main-fi
2ffd0 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73  le journal, this
2ffe0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f   function will o
2fff0 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d  pen.  ** a file-
30000 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
30010 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e  e directory too.
30020 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
30030 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20  unixSync().  ** 
30040 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69  is called the di
30050 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
30060 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
30070 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c  fsync()ed and cl
30080 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69  ose()d..  */.  i
30090 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73  nt syncDir = (is
300a0 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
300b0 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
300c0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
300d0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
300e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
300f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
30100 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
30110 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
30120 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72   ));..  /* If ar
30130 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
30140 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
30150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30160 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
30170 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
30180 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
30190 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
301a0 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
301b0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
301c0 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
301d0 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73  HNAME+2];.  cons
301e0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
301f0 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65  zPath;..  /* Che
30200 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
30210 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
30220 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
30230 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
30240 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
30250 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
30260 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
30270 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
30280 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
30290 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
302a0 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
302b0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
302c0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
302d0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
302e0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
302f0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
30300 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
30310 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
30320 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
30330 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
30340 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
30350 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
30360 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
30370 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
30380 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
30390 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
303a0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
303b0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
303c0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
303d0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
303e0 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
303f0 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
30400 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
30410 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
30420 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
30430 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
30440 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
30450 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
30460 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
30470 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
30480 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
30490 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
304a0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
304b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
304c0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
304d0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
304e0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
304f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30500 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
30510 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
30520 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
30530 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
30540 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
30550 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
30560 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
30570 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
30580 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
30590 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
305a0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
305b0 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
305c0 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
305d0 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
305e0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
305f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
30600 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
30610 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
30620 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
30630 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
30640 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
30650 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30660 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
30670 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
30680 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
30690 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
306a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
306b0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
306c0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
306d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
306e0 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
306f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30700 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44  WAL.  );..  /* D
30710 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61 6e  etect a pid chan
30720 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ge and reset the
30730 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73   PRNG.  There is
30740 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
30750 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68  n.  ** here such
30760 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72   that two or mor
30770 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72  e threads all tr
30780 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74  ying to open dat
30790 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74  abases at.  ** t
307a0 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20  he same instant 
307b0 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20  might all reset 
307c0 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d  the PRNG.  But m
307d0 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20  ultiple resets. 
307e0 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73   ** are harmless
307f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e  ..  */.  if( ran
30800 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47 65  domnessPid!=osGe
30810 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20 72  tpid(0) ){.    r
30820 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
30830 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20 20  sGetpid(0);.    
30840 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
30850 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20  ss(0,0);.  }..  
30860 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
30870 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
30880 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
30890 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
308a0 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
308b0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
308c0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
308d0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
308e0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
308f0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
30900 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
30910 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
30920 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
30930 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
30940 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  64(sizeof(*pUnus
30950 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
30960 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
30970 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30980 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
30990 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
309a0 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  p->pUnused = pUn
309b0 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61  used;..    /* Da
309c0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
309d0 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
309e0 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
309f0 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20  hey are not.    
30a00 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
30a10 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
30a20 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
30a30 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
30a40 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
30a50 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
30a60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
30a70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
30a80 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d  PEN_URI) || zNam
30a90 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  e[strlen(zName)+
30aa0 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73  1]==0 );..  }els
30ab0 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a  e if( !zName ){.
30ac0 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
30ad0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70  is NULL, the upp
30ae0 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75  er layer is requ
30af0 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69  esting a temp fi
30b00 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
30b10 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73  t(isDelete && !s
30b20 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20  yncDir);.    rc 
30b30 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
30b40 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  e(pVfs->mxPathna
30b50 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  me, zTmpname);. 
30b60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
30b80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
30b90 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e     zName = zTmpn
30ba0 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ame;..    /* Gen
30bb0 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79  erated temporary
30bc0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61   filenames are a
30bd0 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72  lways double-zer
30be0 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20  o terminated.   
30bf0 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73   ** for use by s
30c00 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
30c10 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
30c20 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72  ssert( zName[str
30c30 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30  len(zName)+1]==0
30c40 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65   );.  }..  /* De
30c50 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
30c60 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70  e of the flags p
30c70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20  arameter passed 
30c80 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f  to POSIX functio
30c90 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54  n.  ** open(). T
30ca0 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c  hese must be cal
30cb0 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20  culated even if 
30cc0 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  open() is not ca
30cd0 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68  lled, as.  ** th
30ce0 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  ey may be stored
30cf0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
30d00 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20  file handle and 
30d10 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a  used by the .  *
30d20 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c  * 'conch file' l
30d30 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  ocking functions
30d40 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20   later on.  */. 
30d50 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
30d60 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  )  openFlags |= 
30d70 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  O_RDONLY;.  if( 
30d80 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70  isReadWrite ) op
30d90 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57  enFlags |= O_RDW
30da0 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74  R;.  if( isCreat
30db0 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  e )    openFlags
30dc0 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69   |= O_CREAT;.  i
30dd0 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
30de0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
30df0 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
30e00 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  );.  openFlags |
30e10 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  = (O_LARGEFILE|O
30e20 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28  _BINARY);..  if(
30e30 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64   fd<0 ){.    mod
30e40 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20  e_t openMode;   
30e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65             /* Pe
30e60 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65  rmissions to cre
30e70 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  ate file with */
30e80 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20  .    uid_t uid; 
30e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ea0 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72     /* Userid for
30eb0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
30ec0 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20   gid_t gid;     
30ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ee0 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68  * Groupid for th
30ef0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63  e file */.    rc
30f00 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c   = findCreateFil
30f10 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61  eMode(zName, fla
30f20 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26  gs, &openMode, &
30f30 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20  uid, &gid);.    
30f40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30f50 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
30f60 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29  t( !p->pUnused )
30f70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30f80 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30f90 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d  EN_WAL || eType=
30fa0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
30fb0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20  N_JOURNAL );.   
30fc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30fd0 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62    }.    fd = rob
30fe0 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
30ff0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
31000 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ode);.    OSTRAC
31010 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64  E(("OPENX   %-3d
31020 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20   %s 0%o\n", fd, 
31030 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
31040 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
31050 21 69 73 45 78 63 6c 75 73 69 76 65 20 7c 7c 20  !isExclusive || 
31060 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43  (openFlags & O_C
31070 52 45 41 54 29 21 3d 30 20 29 3b 0a 20 20 20 20  REAT)!=0 );.    
31080 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
31090 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
310a0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
310b0 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
310c0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
310d0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
310e0 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
310f0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67  y. */.      flag
31100 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
31110 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
31120 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
31130 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
31140 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f  s &= ~(O_RDWR|O_
31150 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c  CREAT);.      fl
31160 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
31170 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
31180 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
31190 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
311a0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
311b0 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
311c0 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
311d0 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
311e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
311f0 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
31200 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
31210 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
31220 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
31230 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
31240 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
31250 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
31260 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
31270 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
31280 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74 69  ot and if creati
31290 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63  ng a new rollbac
312a0 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  k.    ** journal
312b0 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65   or WAL file, se
312c0 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20  t the ownership 
312d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  of the journal o
312e0 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20  r WAL to be.    
312f0 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
31300 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
31310 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
31320 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
31330 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
31340 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
31350 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20  OURNAL) ){.     
31360 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 66 64   robustFchown(fd
31370 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20  , uid, gid);.   
31380 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
31390 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20   fd>=0 );.  if( 
313a0 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
313b0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
313c0 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
313d0 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  p->pUnused ){.  
313e0 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64    p->pUnused->fd
313f0 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55   = fd;.    p->pU
31400 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66  nused->flags = f
31410 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
31420 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
31430 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
31440 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
31450 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
31460 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
31470 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74  _CLOSE).    zPat
31480 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  h = sqlite3_mpri
31490 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29  ntf("%s", zName)
314a0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d  ;.    if( zPath=
314b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
314c0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
314d0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
314e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
314f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
31500 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c  .#else.    osUnl
31510 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64  ink(zName);.#end
31520 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  if.  }.#if SQLIT
31530 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
31540 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20  _STYLE.  else{. 
31550 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20     p->openFlags 
31560 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d  = openFlags;.  }
31570 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 64  .#endif.  .#if d
31580 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
31590 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
315a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
315b0 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66  .  if( fstatfs(f
315c0 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  d, &fsInfo) == -
315d0 31 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  1 ){.    storeLa
315e0 73 74 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f  stErrno(p, errno
315f0 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  );.    robust_cl
31600 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
31610 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E__);.    return
31620 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
31630 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  CESS;.  }.  if (
31640 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
31650 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
31660 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
31670 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
31680 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
31690 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
316a0 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
316b0 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
316c0 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49  cmp("exfat", fsI
316d0 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
316e0 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
316f0 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
31700 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
31710 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
31720 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OS;.  }.#endif..
31730 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72    /* Set up appr
31740 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67  opriate ctrlFlag
31750 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c  s */.  if( isDel
31760 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20  ete )           
31770 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
31780 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
31790 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  E;.  if( isReado
317a0 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20  nly )           
317b0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
317c0 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b  UNIXFILE_RDONLY;
317d0 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
317e0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
317f0 41 49 4e 5f 44 42 3b 0a 20 20 69 66 28 20 6e 6f  AIN_DB;.  if( no
31800 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20  Lock )          
31810 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
31820 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
31830 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63  LOCK;.  if( sync
31840 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20  Dir )           
31850 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
31860 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  |= UNIXFILE_DIRS
31870 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  YNC;.  if( flags
31880 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
31890 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c  RI ) ctrlFlags |
318a0 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a  = UNIXFILE_URI;.
318b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
318c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
318d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
318e0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
318f0 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
31900 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
31910 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
31920 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
31930 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
31940 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
31950 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
31960 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
31970 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
31980 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
31990 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
319a0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
319b0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
319c0 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
319d0 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
319e0 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
319f0 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
31a00 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
31a10 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
31a20 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
31a30 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
31a40 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
31a50 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
31a60 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
31a70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
31a80 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21      useProxy = !
31a90 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
31aa0 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20  MNT_LOCAL);.    
31ab0 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f  }.    if( usePro
31ac0 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
31ad0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
31ae0 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
31af0 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
31b00 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
31b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31b20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
31b30 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
31b40 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46  le((unixFile*)pF
31b50 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  ile, ":auto:");.
31b60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31b80 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e         /* Use un
31b90 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e  ixClose to clean
31ba0 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65   up the resource
31bb0 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49  s added in fillI
31bc0 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20  nUnixFile .     
31bd0 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61       ** and clea
31be0 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74  r all the struct
31bf0 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73  ure's references
31c00 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
31c10 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
31c20 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77  File->pMethods w
31c30 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73  ill be NULL so s
31c40 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69  qlite3OsClose wi
31c50 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20  ll be a no-op . 
31c60 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
31c70 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28        unixClose(
31c80 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
31c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31cb0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
31cc0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
31cd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
31ce0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
31cf0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
31d00 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
31d10 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e  lags);..open_fin
31d20 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
31d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31d50 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a  ->pUnused);.  }.
31d60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31d70 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
31d80 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
31d90 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
31da0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
31db0 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
31dc0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
31dd0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
31de0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
31df0 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20  t unixDelete(.  
31e00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
31e10 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53  Used,     /* VFS
31e20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
31e30 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20   as the xDelete 
31e40 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
31e50 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
31e60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
31e70 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
31e80 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ted */.  int dir
31e90 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
31ea0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66     /* If true, f
31eb0 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79  sync() directory
31ec0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
31ed0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
31ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31ef0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31f00 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
31f10 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
31f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
31f30 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69  ERR_DELETE);.  i
31f40 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74  f( osUnlink(zPat
31f50 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  h)==(-1) ){.    
31f60 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e  if( errno==ENOEN
31f70 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  T.#if OS_VXWORKS
31f80 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63  .        || osAc
31f90 63 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30  cess(zPath,0)!=0
31fa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20  .#endif.    ){. 
31fb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31fc0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
31fd0 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ENT;.    }else{.
31fe0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
31ff0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
32000 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e  OERR_DELETE, "un
32010 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20  link", zPath);. 
32020 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
32030 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  rc;.  }.#ifndef 
32040 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
32050 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69  IRSYNC.  if( (di
32060 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b  rSync & 1)!=0 ){
32070 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20  .    int fd;.   
32080 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
32090 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64  ctory(zPath, &fd
320a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
320b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
320c0 20 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63    if( full_fsync
320d0 28 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  (fd,0,0) ){.    
320e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
320f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
32100 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
32110 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
32120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
32130 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
32140 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
32150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
32160 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
32170 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20  CANTOPEN );.    
32180 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
32190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
321a0 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
321b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
321c0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f  e existence of o
321d0 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
321e0 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
321f0 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
32200 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
32210 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
32220 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
32230 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
32240 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
32250 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
32260 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
32270 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
32280 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
32290 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
322a0 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
322b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
322c0 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
322d0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
322e0 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
322f0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
32300 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
32310 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
32320 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
32330 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f  fs *NotUsed,   /
32340 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69  * The VFS contai
32350 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73  ning this xAcces
32360 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  s method */.  co
32370 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
32380 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
32390 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61   the file to exa
323a0 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  mine */.  int fl
323b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
323c0 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20    /* What do we 
323d0 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62  want to learn ab
323e0 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69  out the zPath fi
323f0 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  le? */.  int *pR
32400 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
32410 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
32420 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f   boolean here */
32430 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
32440 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32450 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
32460 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
32470 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
32480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
32490 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  sOut!=0 );..  /*
324a0 20 54 68 65 20 73 70 65 63 20 73 61 79 73 20 74   The spec says t
324b0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 70  here are three p
324c0 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66  ossible values f
324d0 6f 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f  or flags.  But o
324e0 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20  nly.  ** two of 
324f0 74 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c 6c  them are actuall
32500 79 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  y used */.  asse
32510 72 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54  rt( flags==SQLIT
32520 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
32530 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  || flags==SQLITE
32540 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
32550 45 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  E );..  if( flag
32560 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
32570 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 73  _EXISTS ){.    s
32580 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
32590 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28      *pResOut = (
325a0 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
325b0 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74   &buf) && buf.st
325c0 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73  _size>0);.  }els
325d0 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  e{.    *pResOut 
325e0 3d 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68  = osAccess(zPath
325f0 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b  , W_OK|R_OK)==0;
32600 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
32610 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
32620 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
32630 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  mkFullPathname(.
32640 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
32650 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
32660 20 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20    /* Input path 
32670 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c  */.  char *zOut,
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32690 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
326a0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
326b0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
326c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
326d0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
326e0 62 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29  buffer zOut */.)
326f0 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20  {.  int nPath = 
32700 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
32710 7a 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f  zPath);.  int iO
32720 66 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50  ff = 0;.  if( zP
32730 61 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20  ath[0]!='/' ){. 
32740 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28     if( osGetcwd(
32750 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30  zOut, nOut-2)==0
32760 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
32770 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
32780 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
32790 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50  PT, "getcwd", zP
327a0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
327b0 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53 74  iOff = sqlite3St
327c0 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20  rlen30(zOut);.  
327d0 20 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d    zOut[iOff++] =
327e0 20 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '/';.  }.  if( 
327f0 28 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e  (iOff+nPath+1)>n
32800 4f 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51  Out ){.    /* SQ
32810 4c 69 74 65 20 61 73 73 75 6d 65 73 20 74 68 61  Lite assumes tha
32820 74 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  t xFullPathname(
32830 29 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73  ) nul-terminates
32840 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
32850 65 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 69  er.    ** even i
32860 66 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e 20  f it returns an 
32870 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a  error.  */.    z
32880 4f 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27  Out[iOff] = '\0'
32890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
328a0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
328b0 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
328c0 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69  _snprintf(nOut-i
328d0 4f 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d  Off, &zOut[iOff]
328e0 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
328f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32900 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  OK;.}../*.** Tur
32910 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
32920 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
32930 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20  l pathname. The 
32940 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a  relative path.**
32950 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20   is stored as a 
32960 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
32970 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66  tring in the buf
32980 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
32990 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a  y.** zPath. .**.
329a0 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74  ** zOut points t
329b0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
329c0 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76   least sqlite3_v
329d0 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  fs.mxPathname by
329e0 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73  tes .** (in this
329f0 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e   case, MAX_PATHN
32a00 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20  AME bytes). The 
32a10 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69  full-path is wri
32a20 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20  tten to.** this 
32a30 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65  buffer before re
32a40 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
32a50 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50  ic int unixFullP
32a60 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
32a70 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
32a80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
32a90 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
32aa0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
32ab0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
32ac0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
32ad0 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
32ae0 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  path */.  int nO
32af0 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
32b00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
32b10 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
32b20 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
32b30 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b50 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
32b60 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .){.#if !defined
32b70 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20  (HAVE_READLINK) 
32b80 7c 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  || !defined(HAVE
32b90 5f 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72 6e  _LSTAT).  return
32ba0 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28   mkFullPathname(
32bb0 7a 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75  zPath, zOut, nOu
32bc0 74 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  t);.#else.  int 
32bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32be0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
32bf0 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20  nt nLink = 1;   
32c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32c10 4e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c  Number of symbol
32c20 69 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65  ic links followe
32c30 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f  d so far */.  co
32c40 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20  nst char *zIn = 
32c50 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 49  zPath;      /* I
32c60 6e 70 75 74 20 70 61 74 68 20 66 6f 72 20 65 61  nput path for ea
32c70 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
32c80 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a  loop */.  char *
32c90 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73  zDel = 0;..  ass
32ca0 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
32cb0 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
32cc0 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
32cd0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
32ce0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
32cf0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
32d00 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
32d10 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
32d20 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
32d30 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
32d40 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
32d50 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
32d60 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
32d70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
32d80 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
32d90 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
32da0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
32db0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
32dc0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
32dd0 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
32de0 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
32df0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
32e00 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
32e10 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20   );..  do {..   
32e20 20 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29 20   /* Call stat() 
32e30 6f 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65 74  on path zIn. Set
32e40 20 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20 69   bLink to true i
32e50 66 20 74 68 65 20 70 61 74 68 20 69 73 20 61 20  f the path is a 
32e60 73 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20  symbolic.    ** 
32e70 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f  link, or false o
32e80 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20  therwise.  */.  
32e90 20 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b    int bLink = 0;
32ea0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
32eb0 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f 73   buf;.    if( os
32ec0 4c 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66 29  Lstat(zIn, &buf)
32ed0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
32ee0 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29   errno!=ENOENT )
32ef0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
32f00 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
32f10 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
32f20 2c 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b  , "lstat", zIn);
32f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
32f40 73 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20  se{.      bLink 
32f50 3d 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74  = S_ISLNK(buf.st
32f60 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  _mode);.    }.. 
32f70 20 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a     if( bLink ){.
32f80 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d        if( zDel==
32f90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  0 ){.        zDe
32fa0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
32fb0 6f 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  oc(nOut);.      
32fc0 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20    if( zDel==0 ) 
32fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
32fe0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  M_BKPT;.      }e
32ff0 6c 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e  lse if( ++nLink>
33000 53 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49  SQLITE_MAX_SYMLI
33010 4e 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20 72  NKS ){.        r
33020 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
33030 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
33040 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
33050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33060 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73        nByte = os
33070 52 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44  Readlink(zIn, zD
33080 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20  el, nOut-1);.   
33090 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 30       if( nByte<0
330a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
330b0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
330c0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
330d0 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22  BKPT, "readlink"
330e0 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  , zIn);.        
330f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
33100 20 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f   if( zDel[0]!='/
33110 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
33120 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
33130 20 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69      for(n = sqli
33140 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29  te3Strlen30(zIn)
33150 3b 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31  ; n>0 && zIn[n-1
33160 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20  ]!='/'; n--);.  
33170 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 42            if( nB
33180 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a  yte+n+1>nOut ){.
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
331a0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
331b0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
331c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
331d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
331e0 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c  e(&zDel[n], zDel
331f0 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20  , nByte+1);.    
33200 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
33210 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a  (zDel, zIn, n);.
33220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42                nB
33230 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  yte += n;.      
33240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33250 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 44    }.          zD
33260 65 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27  el[nByte] = '\0'
33270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33280 20 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d    }..      zIn =
33290 20 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20   zDel;.    }..  
332a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
332b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d  LITE_OK || zIn!=
332c0 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d  zOut || zIn[0]==
332d0 27 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20 72  '/' );.    if( r
332e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
332f0 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20  zIn!=zOut ){.   
33300 20 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61     rc = mkFullPa
33310 74 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74  thname(zIn, zOut
33320 2c 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  , nOut);.    }. 
33330 20 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20     if( bLink==0 
33340 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e  ) break;.    zIn
33350 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c   = zOut;.  }whil
33360 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
33370 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
33380 72 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74  ree(zDel);.  ret
33390 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20 20  urn rc;.#endif  
333a0 20 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49 4e   /* HAVE_READLIN
333b0 4b 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54 20  K && HAVE_LSTAT 
333c0 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  */.}...#ifndef S
333d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
333e0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
333f0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
33400 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
33410 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
33420 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
33430 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
33440 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
33450 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
33460 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
33470 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
33480 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
33490 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
334a0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
334b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
334c0 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44  ename){.  UNUSED
334d0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
334e0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c  ed);.  return dl
334f0 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
33500 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
33510 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
33520 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
33530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
33540 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
33550 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
33560 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
33570 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
33580 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
33590 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
335a0 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
335b0 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
335c0 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
335d0 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
335e0 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
335f0 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
33600 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
33610 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
33620 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
33630 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
33640 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
33650 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
33660 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
33670 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
33680 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
33690 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e  *zBufOut){.  con
336a0 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
336b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
336c0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e  R(NotUsed);.  un
336d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
336e0 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
336f0 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
33700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
33710 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
33720 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
33730 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
33740 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
33750 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44  tic void (*unixD
33760 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
33770 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
33780 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a  *p, const char*z
33790 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f  Sym))(void){.  /
337a0 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68  * .  ** GCC with
337b0 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
337c0 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20  s says that C90 
337d0 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
337e0 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a   void* to be.  *
337f0 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f  * cast into a po
33800 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
33810 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68  ion.  And yet th
33820 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28  e library dlsym(
33830 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72  ) routine.  ** r
33840 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77  eturns a void* w
33850 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
33860 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
33870 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20  nction.  So how 
33880 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64  do we.  ** use d
33890 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64  lsym() with -ped
338a0 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20  antic-errors?.  
338b0 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
338c0 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69   x below is defi
338d0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e  ned to be a poin
338e0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
338f0 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61  n taking.  ** pa
33900 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61  rameters void* a
33910 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61  nd const char* a
33920 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70  nd returning a p
33930 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
33940 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e  tion..  ** We in
33950 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73  itialize x by as
33960 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69  signing it a poi
33970 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79  nter to the dlsy
33980 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  m() function..  
33990 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d  ** (That assignm
339a0 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63  ent requires a c
339b0 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63  ast.)  Then we c
339c0 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  all the function
339d0 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69   that.  ** x poi
339e0 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20  nts to.  .  **. 
339f0 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72   ** This work-ar
33a00 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79  ound is unlikely
33a10 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
33a20 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d  ly on any system
33a30 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20   where.  ** you 
33a40 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61  really cannot ca
33a50 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  st a function po
33a60 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a  inter into void*
33a70 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20  .  But then, on 
33a80 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  the.  ** other h
33a90 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c  and, dlsym() wil
33aa0 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75  l not work on su
33ab0 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68  ch a system eith
33ac0 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20  er, so we have. 
33ad0 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c   ** not really l
33ae0 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20  ost anything..  
33af0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29  */.  void (*(*x)
33b00 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
33b10 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e  r*))(void);.  UN
33b20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33b30 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28  otUsed);.  x = (
33b40 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c  void(*(*)(void*,
33b50 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
33b60 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74  id))dlsym;.  ret
33b70 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d  urn (*x)(p, zSym
33b80 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
33b90 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
33ba0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
33bb0 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  d, void *pHandle
33bc0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
33bd0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33be0 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
33bf0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
33c00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
33c10 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
33c20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
33c30 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
33c40 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
33c50 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
33c60 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
33c70 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
33c80 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
33c90 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
33ca0 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
33cb0 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
33cc0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
33cd0 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
33ce0 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
33cf0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
33d00 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
33d10 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
33d20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33d30 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33d40 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e  assert((size_t)n
33d50 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
33d60 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
33d70 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
33d80 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
33d90 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
33da0 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
33db0 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
33dc0 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
33dd0 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
33de0 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
33df0 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
33e00 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
33e10 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
33e20 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
33e30 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
33e40 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
33e50 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
33e60 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
33e70 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
33e80 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
33e90 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
33ea0 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
33eb0 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
33ec0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
33ed0 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
33ee0 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
33ef0 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
33f00 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
33f10 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
33f20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
33f30 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
33f40 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
33f50 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
33f60 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
33f70 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
33f80 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
33f90 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
33fa0 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
33fb0 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
33fc0 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
33fd0 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
33fe0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
33ff0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
34000 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20    randomnessPid 
34010 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20 20  = osGetpid(0);  
34020 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
34030 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64  LITE_TEST) && !d
34040 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
34050 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20  IT_RANDOMNESS). 
34060 20 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67   {.    int fd, g
34070 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  ot;.    fd = rob
34080 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75  ust_open("/dev/u
34090 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
340a0 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
340b0 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d  d<0 ){.      tim
340c0 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d  e_t t;.      tim
340d0 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e(&t);.      mem
340e0 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69  cpy(zBuf, &t, si
340f0 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20  zeof(t));.      
34100 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
34110 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d  eof(t)], &random
34120 6e 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28  nessPid, sizeof(
34130 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b  randomnessPid));
34140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
34150 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28  izeof(t)+sizeof(
34160 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d  randomnessPid)<=
34170 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a  (size_t)nBuf );.
34180 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a        nBuf = siz
34190 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28  eof(t) + sizeof(
341a0 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a  randomnessPid);.
341b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
341c0 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61   do{ got = osRea
341d0 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66  d(fd, zBuf, nBuf
341e0 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
341f0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
34200 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   );.      robust
34210 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
34220 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
34230 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
34240 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nBuf;.}.../*.
34250 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
34260 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
34270 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
34280 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
34290 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
342a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
342b0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20  microseconds we 
342c0 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a  want to sleep..*
342d0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
342e0 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
342f0 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
34300 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c   of sleep actual
34310 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  ly.** requested 
34320 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
34330 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
34340 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77  stem, a number w
34350 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
34360 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
34370 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72   equal to the ar
34380 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  gument, but not 
34390 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65  less.** than the
343a0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
343b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65  atic int unixSle
343c0 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
343d0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63  NotUsed, int mic
343e0 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  roseconds){.#if 
343f0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
34400 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b  uct timespec sp;
34410 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20  ..  sp.tv_sec = 
34420 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31  microseconds / 1
34430 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f  000000;.  sp.tv_
34440 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63  nsec = (microsec
34450 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20  onds % 1000000) 
34460 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c  * 1000;.  nanosl
34470 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a  eep(&sp, NULL);.
34480 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34490 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
344a0 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
344b0 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  ds;.#elif define
344c0 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
344d0 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  & HAVE_USLEEP.  
344e0 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f  usleep(microseco
344f0 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
34500 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
34510 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
34520 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a  oseconds;.#else.
34530 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20    int seconds = 
34540 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39  (microseconds+99
34550 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20  9999)/1000000;. 
34560 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b   sleep(seconds);
34570 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
34580 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
34590 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31  return seconds*1
345a0 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d  000000;.#endif.}
345b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
345c0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
345d0 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
345e0 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
345f0 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
34600 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
34610 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
34620 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
34630 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
34640 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
34650 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
34660 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
34670 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
34680 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
34690 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
346a0 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
346b0 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
346c0 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
346d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
346e0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
346f0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
34700 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
34710 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
34720 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
34730 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
34740 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
34750 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
34760 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
34770 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
34780 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
34790 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
347a0 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
347b0 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
347c0 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
347d0 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
347e0 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
347f0 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
34800 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
34810 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
34820 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
34830 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
34840 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
34850 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
34860 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
34870 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
34880 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
34890 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75  tatic int unixCu
348a0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
348b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
348c0 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  sed, sqlite3_int
348d0 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74  64 *piNow){.  st
348e0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
348f0 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
34900 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
34910 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
34920 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d  0000;.  int rc =
34930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20   SQLITE_OK;.#if 
34940 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f  defined(NO_GETTO
34950 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  D).  time_t t;. 
34960 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69   time(&t);.  *pi
34970 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f  Now = ((sqlite3_
34980 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20  int64)t)*1000 + 
34990 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66  unixEpoch;.#elif
349a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
349b0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e  ruct timespec sN
349c0 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74  ow;.  clock_gett
349d0 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49  ime(CLOCK_REALTI
349e0 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70  ME, &sNow);.  *p
349f0 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
34a00 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
34a10 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
34a20 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65  ec + sNow.tv_nse
34a30 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65  c/1000000;.#else
34a40 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
34a50 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29  l sNow;.  (void)
34a60 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
34a70 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e  ow, 0);  /* Cann
34a80 6f 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76 61  ot fail given va
34a90 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  lid arguments */
34aa0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
34ab0 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
34ac0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
34ad0 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
34ae0 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e  v_usec/1000;.#en
34af0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
34b00 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
34b10 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
34b20 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
34b30 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
34b40 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
34b50 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
34b60 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
34b70 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
34b80 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
34b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34ba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34bb0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
34bc0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
34bd0 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
34be0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
34bf0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
34c00 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
34c10 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
34c20 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
34c30 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
34c40 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
34c50 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
34c60 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
34c70 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
34c80 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
34c90 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
34ca0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
34cb0 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20  NotUsed, double 
34cc0 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74  *prNow){.  sqlit
34cd0 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a  e3_int64 i = 0;.
34ce0 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53    int rc;.  UNUS
34cf0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34d00 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e  Used);.  rc = un
34d10 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
34d20 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72  64(0, &i);.  *pr
34d30 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
34d40 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .0;.  return rc;
34d50 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
34d60 65 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  e unixCurrentTim
34d70 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  e 0.#endif../*.*
34d80 2a 20 54 68 65 20 78 47 65 74 4c 61 73 74 45 72  * The xGetLastEr
34d90 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73 20  ror() method is 
34da0 64 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74 75  designed to retu
34db0 72 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c  rn a better.** l
34dc0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d  ow-level error m
34dd0 65 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65 72  essage when oper
34de0 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
34df0 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
34e00 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
34e10 70 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20  peration.  Only 
34e20 74 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  the integer retu
34e30 72 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72 65  rn code is curre
34e40 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f  ntly.** used..*/
34e50 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
34e60 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
34e70 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
34e80 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
34e90 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
34ea0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
34eb0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
34ec0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34ed0 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
34ee0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34ef0 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
34f00 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f  urn errno;.}.../
34f10 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
34f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
34f30 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
34f40 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
34f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34f60 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
34f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34fb0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
34fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35000 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
35010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
35020 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
35030 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
35040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35050 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
35060 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
35070 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
35080 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
35090 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
350a0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
350b0 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
350c0 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
350d0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
350e0 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
350f0 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
35100 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
35110 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
35120 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
35130 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
35140 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
35150 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
35160 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
35170 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
35180 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
35190 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
351a0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
351b0 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
351c0 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
351d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
351e0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
351f0 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
35200 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
35210 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
35220 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
35230 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
35240 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
35250 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
35260 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
35270 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
35280 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
35290 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
352a0 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
352b0 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
352c0 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
352d0 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
352e0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
352f0 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
35300 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
35310 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
35320 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
35330 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
35340 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
35350 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
35360 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
35370 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
35380 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
35390 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
353a0 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
353b0 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
353c0 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
353d0 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
353e0 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
353f0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
35400 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
35410 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
35420 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
35430 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
35440 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
35450 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
35460 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
35470 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
35480 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
35490 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
354a0 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
354b0 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
354c0 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
354d0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
354e0 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
354f0 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
35500 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
35510 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
35520 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
35530 20 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a     0x40000000.**
35540 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42        RESERVED_B
35550 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30  YTE       0x4000
35560 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41  0001.**      SHA
35570 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20  RED_RANGE       
35580 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30   0x40000002 -> 0
35590 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20  x40000200.**.** 
355a0 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20  This works well 
355b0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
355c0 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68  e system, but sh
355d0 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30  ows a nearly 100
355e0 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e  x.** slowdown in
355f0 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63   read performanc
35600 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65  e on AFP because
35610 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20   the AFP client 
35620 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20  disables.** the 
35630 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20  read cache when 
35640 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
35650 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45   are present.  E
35660 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64  nabling the read
35670 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65  .** cache expose
35680 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65  s a cache cohere
35690 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  ncy problem that
356a0 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61   is present on a
356b0 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f  ll OS X.** suppo
356c0 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c  rted network fil
356d0 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20  e systems.  NFS 
356e0 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73  and AFP both obs
356f0 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73  erve the.** clos
35700 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74  e-to-open semant
35710 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ics for ensuring
35720 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
35730 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e  .** [http://nfs.
35740 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
35750 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20  #faq_a8], which 
35760 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69  does not effecti
35770 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20  vely.** address 
35780 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73  the requirements
35790 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20   for concurrent 
357a0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
357b0 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72  by multiple.** r
357c0 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
357d0 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77  rs.** [http://ww
357e0 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c  w.nabble.com/SQL
357f0 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65  ite-on-NFS-cache
35800 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36  -coherency-td156
35810 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a  55701.html]..**.
35820 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68  ** To address th
35830 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e  e performance an
35840 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  d cache coherenc
35850 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20  y issues, proxy 
35860 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
35870 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20  changes the way 
35880 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
35890 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79  is controlled by
358a0 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73   limiting access
358b0 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   to a.** single 
358c0 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61  host at a time a
358d0 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c  nd moving file l
358e0 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20  ocks off of the 
358f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
35900 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78   and onto a prox
35910 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  y file on the lo
35920 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  cal file system.
35930 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e    .**.**.** Usin
35940 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a  g proxy locks.**
35950 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
35960 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a  --.**.** C APIs.
35970 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  **.**  sqlite3_f
35980 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
35990 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  dbname, SQLITE_F
359a0 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
359b0 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20  XYFILE,.**      
359c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359d0 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20   <proxy_path> | 
359e0 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73  ":auto:");.**  s
359f0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
35a00 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
35a10 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54  SQLITE_FCNTL_GET
35a20 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
35a30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
35a40 20 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79           &<proxy
35a50 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
35a60 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
35a70 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
35a80 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
35a90 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
35aa0 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
35ab0 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
35ac0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
35ad0 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
35ae0 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
35af0 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
35b00 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
35b10 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
35b20 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
35b30 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
35b40 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
35b50 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
35b60 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
35b70 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
35b80 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
35b90 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
35ba0 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
35bb0 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
35bc0 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
35bd0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
35be0 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
35bf0 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
35c00 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
35c10 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
35c20 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
35c30 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
35c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
35c50 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
35c60 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
35c70 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
35c80 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
35c90 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
35ca0 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
35cb0 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
35cc0 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
35cd0 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
35ce0 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
35cf0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
35d00 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
35d10 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
35d20 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
35d30 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
35d40 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
35d50 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
35d60 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
35d70 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
35d80 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
35d90 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
35da0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
35db0 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
35dc0 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
35dd0 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
35de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35df0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
35e00 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
35e10 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
35e20 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
35e30 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
35e40 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
35e50 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
35e60 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
35e70 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
35e80 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
35e90 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
35ea0 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
35eb0 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
35ec0 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
35ed0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
35ee0 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
35ef0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
35f00 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
35f10 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
35f20 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
35f30 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
35f40 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
35f50 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
35f60 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
35f70 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
35f80 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
35f90 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
35fa0 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
35fb0 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
35fc0 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
35fd0 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
35fe0 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
35ff0 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
36000 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
36010 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
36020 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
36030 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
36040 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
36050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36060 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
36070 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
36080 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
36090 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
360a0 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
360b0 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
360c0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
360d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
360e0 20 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73   or its contents
360f0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68   do not match th
36100 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64  e.** host ID and
36110 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20  /or proxy path, 
36120 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73  then the lock is
36130 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e   escalated to an
36140 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f   exclusive.** lo
36150 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68  ck and the conch
36160 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69   file contents i
36170 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  s updated with t
36180 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70  he host ID and p
36190 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64  roxy.** path and
361a0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77   the lock is dow
361b0 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61  ngraded to a sha
361c0 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20  red lock again. 
361d0 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a   If the conch.**
361e0 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74   is held by anot
361f0 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74  her process (wit
36200 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29  h a shared lock)
36210 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  , the exclusive 
36220 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69  lock.** will fai
36230 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53  l and SQLITE_BUS
36240 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
36250 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
36260 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62  ile - a single-b
36270 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  yte file used fo
36280 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66  r all advisory f
36290 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72  ile locks.** nor
362a0 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74  mally taken on t
362b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
362c0 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .   This allows 
362d0 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67  for safe sharing
362e0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
362f0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c  ase file for mul
36300 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e  tiple readers an
36310 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65  d writers on the
36320 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74   same.** host (t
36330 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73  he conch ensures
36340 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75   that they all u
36350 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61  se the same loca
36360 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a  l lock file)..**
36370 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74  .** Requesting t
36380 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f  he lock proxy do
36390 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65  es not immediate
363a0 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63  ly take the conc
363b0 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79  h, it is.** only
363c0 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
363d0 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f  first request to
363e0 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66   lock database f
363f0 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a  ile is made.  .*
36400 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  * This matches t
36410 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20  he semantics of 
36420 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20  the traditional 
36430 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  locking behavior
36440 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69  , where.** openi
36450 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ng a connection 
36460 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
36470 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65  le does not take
36480 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a   a lock on it..*
36490 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63  * The shared loc
364a0 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69  k and an open fi
364b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
364c0 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74  e maintained unt
364d0 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65  il .** the conne
364e0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
364f0 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e  abase is closed.
36500 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78   .**.** The prox
36510 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c  y file and the l
36520 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76  ock file are nev
36530 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68  er deleted so th
36540 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20  ey only need.** 
36550 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68  to be created th
36560 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
36570 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  y are used..**.*
36580 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
36590 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d  options.** -----
365a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
365b0 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50  .**.**  SQLITE_P
365c0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
365d0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ING.**.**       
365e0 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  Database files a
365f0 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c  ccessed on non-l
36600 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
36610 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  s are.**       a
36620 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e  utomatically con
36630 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78  figured for prox
36640 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20  y locking, lock 
36650 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20  files are.**    
36660 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74     named automat
36670 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65  ically using the
36680 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a   same logic as.*
36690 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  *       PRAGMA l
366a0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22  ock_proxy_file="
366b0 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a  :auto:".**    .*
366c0 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  *  SQLITE_PROXY_
366d0 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  DEBUG.**.**     
366e0 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f    Enables the lo
366f0 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d  gging of error m
36700 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68  essages during h
36710 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20  ost id file.**  
36720 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61       retrieval a
36730 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a  nd creation.**.*
36740 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  *  LOCKPROXYDIR.
36750 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72  **.**       Over
36760 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c  rides the defaul
36770 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64  t directory used
36780 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20   for lock proxy 
36790 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  files that.**   
367a0 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75      are named au
367b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20  tomatically via 
367c0 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74  the ":auto:" set
367d0 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ting.**.**  SQLI
367e0 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
367f0 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  DIR_PERMISSIONS.
36800 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d  **.**       Perm
36810 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77  issions to use w
36820 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64  hen creating a d
36830 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f  irectory for sto
36840 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ring the.**     
36850 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c    lock proxy fil
36860 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68  es, only used wh
36870 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20  en LOCKPROXYDIR 
36880 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20  is not set..**  
36890 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20    .**    .** As 
368a0 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c  mentioned above,
368b0 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77   when compiled w
368c0 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45  ith SQLITE_PREFE
368d0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c  R_PROXY_LOCKING,
368e0 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20  .** setting the 
368f0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
36900 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43  able SQLITE_FORC
36910 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  E_PROXY_LOCKING 
36920 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72  to 1 will.** for
36930 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ce proxy locking
36940 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
36950 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66  every database f
36960 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20  ile opened, and 
36970 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20  0.** will force 
36980 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20  automatic proxy 
36990 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69  locking to be di
369a0 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64  sabled for all d
369b0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
369c0 20 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c   (explicitly cal
369d0 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
369e0 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52  FCNTL_SET_LOCKPR
369f0 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
36a00 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
36a10 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
36a20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
36a30 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
36a40 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
36a50 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
36a60 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
36a70 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
36a80 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
36a90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
36aa0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
36ab0 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
36ac0 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
36ad0 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
36ae0 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
36af0 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
36b00 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
36b10 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
36b20 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
36b30 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
36b40 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36b50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36b60 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
36b70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36b80 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
36b90 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
36ba0 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
36bb0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
36bc0 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
36bd0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
36be0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
36bf0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
36c00 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
36c10 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
36c20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
36c30 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
36c40 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
36c50 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
36c60 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
36c70 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
36c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36c90 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
36ca0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
36cb0 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
36cc0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
36cd0 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
36ce0 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
36cf0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c  s */.  int nFail
36d00 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
36d10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36d20 20 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66 61   conch taking fa
36d30 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
36d40 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74   *oldLockingCont
36d50 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  ext;     /* Orig
36d60 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74  inal lockingcont
36d70 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f  ext to restore o
36d80 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c  n close */.  sql
36d90 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
36da0 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f  const *pOldMetho
36db0 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  d;     /* Origin
36dc0 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66  al I/O methods f
36dd0 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a  or close */.};..
36de0 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  /* .** The proxy
36df0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
36e00 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
36e10 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72   at dbPath is wr
36e20 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68  itten into lPath
36e30 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74  , .** which must
36e40 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c   point to valid,
36e50 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
36e60 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
36e70 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74  r a maxLen lengt
36e80 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20  h.** file path. 
36e90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36ea0 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28  roxyGetLockPath(
36eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
36ec0 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c  th, char *lPath,
36ed0 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b   size_t maxLen){
36ee0 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
36ef0 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69  t dbLen;.  int i
36f00 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52  ;..#ifdef LOCKPR
36f10 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73  OXYDIR.  len = s
36f20 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f  trlcpy(lPath, LO
36f30 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c  CKPROXYDIR, maxL
36f40 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64  en);.#else.# ifd
36f50 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  ef _CS_DARWIN_US
36f60 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a  ER_TEMP_DIR.  {.
36f70 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72      if( !confstr
36f80 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
36f90 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68  _TEMP_DIR, lPath
36fa0 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20  , maxLen) ){.   
36fb0 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54     OSTRACE(("GET
36fc0 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64  LOCKPATH  failed
36fd0 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64   %s errno=%d pid
36fe0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
36ff0 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72         lPath, er
37000 72 6e 6f 2c 20 6f 73 47 65 74 70 69 64 28 30 29  rno, osGetpid(0)
37010 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
37020 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37030 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  CK;.    }.    le
37040 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
37050 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73  h, "sqliteplocks
37060 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a  ", maxLen);    .
37070 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
37080 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
37090 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
370a0 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
370b0 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
370c0 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
370d0 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
370e0 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
370f0 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
37100 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
37110 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
37120 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
37130 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
37140 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
37150 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
37160 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
37170 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69  )<(int)maxLen; i
37180 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  ++){.    char c 
37190 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  = dbPath[i];.   
371a0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20   lPath[i+len] = 
371b0 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a  (c=='/')?'_':c;.
371c0 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65    }.  lPath[i+le
371d0 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63  n]='\0';.  strlc
371e0 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f  at(lPath, ":auto
371f0 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f  :", maxLen);.  O
37200 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
37210 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
37220 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
37230 6e 22 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65 74  n", lPath, osGet
37240 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75  pid(0)));.  retu
37250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
37260 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73  ./* . ** Creates
37270 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
37280 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64  nd any missing d
37290 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f  irectories in lo
372a0 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69  ckPath. */.stati
372b0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
372c0 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  eLockPath(const 
372d0 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b  char *lockPath){
372e0 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20  .  int i, len;. 
372f0 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54   char buf[MAXPAT
37300 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61  HLEN];.  int sta
37310 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73  rt = 0;.  .  ass
37320 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55  ert(lockPath!=NU
37330 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f  LL);.  /* try to
37340 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20   create all the 
37350 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72  intermediate dir
37360 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65  ectories */.  le
37370 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
37380 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66  lockPath);.  buf
37390 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30  [0] = lockPath[0
373a0 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69  ];.  for( i=1; i
373b0 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  <len; i++ ){.   
373c0 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d   if( lockPath[i]
373d0 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20   == '/' && (i - 
373e0 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20  start > 0) ){.  
373f0 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69      /* only mkdi
37400 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d  r if leaf dir !=
37410 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22   "." or "/" or "
37420 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  .." */.      if(
37430 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69   i-start>2 || (i
37440 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66  -start==1 && buf
37450 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
37460 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
37470 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c  '/') .         |
37480 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26  | (i-start==2 &&
37490 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
374a0 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b  .' && buf[start+
374b0 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20  1] != '.') ){.  
374c0 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30        buf[i]='\0
374d0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  ';.        if( o
374e0 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49  sMkdir(buf, SQLI
374f0 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
37500 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  DIR_PERMISSIONS)
37510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
37520 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
37530 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d         if( err!=
37540 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20  EEXIST ) {.     
37550 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
37560 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20  "CREATELOCKPATH 
37570 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67   FAILED creating
37580 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20   %s, ".         
37590 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73              "'%s
375a0 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74  ' proxy lock pat
375b0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  h=%s pid=%d\n",.
375c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375d0 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72       buf, strerr
375e0 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74  or(err), lockPat
375f0 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  h, osGetpid(0)))
37600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
37610 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20  turn err;.      
37620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
37630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
37640 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  art=i+1;.    }. 
37650 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b     buf[i] = lock
37660 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f  Path[i];.  }.  O
37670 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c  STRACE(("CREATEL
37680 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
37690 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
376a0 25 64 5c 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f  %d\n",lockPath,o
376b0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
376c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
376d0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
376e0 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
376f0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
37700 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
37710 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
37720 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
37730 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
37740 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
37750 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
37760 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
37770 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
37780 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
37790 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
377a0 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
377b0 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
377c0 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
377d0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
377e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
377f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
37800 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
37810 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
37820 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
37830 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
37840 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
37850 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
37860 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
37870 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
37880 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
37890 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
378a0 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
378b0 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
378c0 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
378d0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
378e0 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
378f0 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
37900 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
37910 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37920 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
37930 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
37940 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
37950 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
37960 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
37970 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
37980 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
37990 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
379a0 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
379b0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
379c0 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
379d0 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
379e0 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
379f0 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
37a00 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
37a10 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
37a20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
37a30 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
37a40 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
37a50 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
37a60 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
37a70 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
37a80 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
37a90 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
37aa0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
37ab0 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
37ac0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
37ad0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
37ae0 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
37af0 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
37b00 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
37b10 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
37b20 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
37b30 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
37b40 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
37b50 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
37b60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
37b70 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
37b80 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
37b90 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
37ba0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
37bb0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72  ags, 0);.    ter
37bc0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
37bd0 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
37be0 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73  no==ENOENT && is
37bf0 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
37c00 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74    if( proxyCreat
37c10 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20  eLockPath(path) 
37c20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  == SQLITE_OK ){.
37c30 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
37c40 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
37c50 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
37c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
37c70 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
37c80 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
37c90 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
37ca0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
37cb0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
37cc0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
37cd0 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
37ce0 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  fd<0 ){.    if( 
37cf0 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
37d00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37d10 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
37d20 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f    switch (terrno
37d30 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ) {.      case E
37d40 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72  ACCES:.        r
37d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
37d60 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49  M;.      case EI
37d70 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  O: .        retu
37d80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
37d90 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68  LOCK; /* even th
37da0 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63  ough it is the c
37db0 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65  onch */.      de
37dc0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72  fault:.        r
37dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
37de0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
37df0 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20  }.  }.  .  pNew 
37e00 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71  = (unixFile *)sq
37e10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
37e20 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
37e30 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
37e40 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
37e50 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
37e60 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61     goto end_crea
37e70 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20  te_proxy;.  }.  
37e80 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
37e90 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
37ea0 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46  );.  pNew->openF
37eb0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
37ec0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
37ed0 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  yVfs, 0, sizeof(
37ee0 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75  dummyVfs));.  du
37ef0 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
37f00 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
37f10 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75  ckIoFinder;.  du
37f20 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22  mmyVfs.zName = "
37f30 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65  dummy";.  pUnuse
37f40 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
37f50 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
37f60 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
37f70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
37f80 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
37f90 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
37fa0 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71  ummyVfs, fd, (sq
37fb0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77  lite3_file*)pNew
37fc0 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66  , path, 0);.  if
37fd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37fe0 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d  ){.    *ppFile =
37ff0 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72   pNew;.    retur
38000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
38010 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78  .end_create_prox
38020 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f  y:    .  robust_
38030 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20  close(pNew, fd, 
38040 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c  __LINE__);.  sql
38050 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
38060 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
38070 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75  pUnused);.  retu
38080 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
38090 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20   SQLITE_TEST./* 
380a0 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
380b0 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
380c0 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
380d0 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
380e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
380f0 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64  id_num = 0;.#end
38100 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  if..#define PROX
38110 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31  Y_HOSTIDLEN    1
38120 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65  6  /* conch file
38130 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20   host id length 
38140 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  */..#ifdef HAVE_
38150 47 45 54 48 4f 53 54 55 55 49 44 0a 2f 2a 20 4e  GETHOSTUUID./* N
38160 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65  ot always define
38170 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 73  d in the headers
38180 20 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20   as it ought to 
38190 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  be */.extern int
381a0 20 67 65 74 68 6f 73 74 75 75 69 64 28 75 75 69   gethostuuid(uui
381b0 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74  d_t id, const st
381c0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77  ruct timespec *w
381d0 61 69 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ait);.#endif../*
381e0 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
381f0 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
38200 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
38210 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
38220 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
38230 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
38240 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
38250 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
38260 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
38270 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
38280 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73   *pError){.  ass
38290 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44  ert(PROXY_HOSTID
382a0 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75  LEN == sizeof(uu
382b0 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  id_t));.  memset
382c0 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f  (pHostID, 0, PRO
382d0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23  XY_HOSTIDLEN);.#
382e0 69 66 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f  ifdef HAVE_GETHO
382f0 53 54 55 55 49 44 0a 20 20 7b 0a 20 20 20 20 73  STUUID.  {.    s
38300 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
38310 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
38320 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
38330 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  t */.    if( get
38340 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
38350 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
38360 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
38370 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
38380 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
38390 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
383a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
383b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
383c0 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
383d0 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
383e0 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a  AMETER(pError);.
383f0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
38400 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
38410 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
38420 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
38430 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
38440 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
38450 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
38460 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
38470 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
38480 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
38490 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
384a0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
384b0 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
384c0 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
384d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
384e0 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
384f0 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
38500 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
38510 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
38520 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
38530 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
38540 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
38550 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
38560 20 69 64 2c 20 70 61 74 68